Grouper avec des agrégats basés sur une autre colonne

Pour une database contenant plusieurs lignes par adresse e-mail, je souhaite regrouper chaque adresse e-mail en prenant les informations les plus récentes pour chaque adresse e-mail.

Email Col1 Col2 Col3 Col4 CustomerID ======= ==== ==== ==== ==== ========== [email protected] aaa null 1 [email protected] null bb null 2 [email protected] null null c null 3 

Je veux prendre la valeur non nulle avec le CustomerID le plus élevé. Pour ci-dessus, je m'attendrais à:

 Email Col1 Col2 Col3 Col4 ======= ==== ==== ==== ==== [email protected] abc null 

Je peux faire un GROUP BY , en prenant le MAX pour chaque colonne, mais c'est simplement la valeur la plus élevée par ordre alphabétique, et ne prend pas en count le CustomerID .

SQL Fiddle

 SELECT EmailAddress, MAX(FirstName), MAX(LastName), MAX(Gender), MAX(Birthday), MAX(Country) FROM CustomerInfo GROUP BY EmailAddress 

En outre, cela est programmé dans Exact Target, ce qui signifie que certains mots-keys SQL ne sont pas pris en charge , notamment les variables, les tables temporaires et les sliders ne sont pas pris en charge.

Compte tenu de ces ressortingctions, est-il possible d'get les résultats souhaités?

Si je comprends bien votre question, je pense que vous devrez vous joindre à la table plusieurs fois. Quelque chose comme ceci devrait fonctionner en utilisant une common table expression pour get l'id de client max pour chaque colonne où la colonne n'est pas null . Ensuite, il se rejoint à lui-même pour get la valeur:

 with cte as ( select email, max(case when col1 is not null then customerid end) maxcustomerid1, max(case when col2 is not null then customerid end) maxcustomerid2, max(case when col3 is not null then customerid end) maxcustomerid3, max(case when col4 is not null then customerid end) maxcustomerid4 from yourtable group by email ) select t.email, t1.col1, t2.col2, t3.col3, t4.col4 from cte t left join yourtable t1 on t.email = t1.email and t.maxcustomerid1 = t1.customerid left join yourtable t2 on t.email = t2.email and t.maxcustomerid2 = t2.customerid left join yourtable t3 on t.email = t3.email and t.maxcustomerid3 = t3.customerid left join yourtable t4 on t.email = t4.email and t.maxcustomerid4 = t4.customerid 
  • Démo de Fiddle SQL