2010-07-15 9 views
1

J'ai les données suivantes:groupe de requêtes SQL par l'aide

cust subject date 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust4 Subject3 2011-02-27 21:59:59.000 
Cust5 Subject1 2010-10-31 21:59:59.000 
Cust5 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-12-31 21:59:59.000 

je dois obtenir les résultats suivants:

  • regrouper par Cust et sous réserve
  • S'il y a 2 enregistrements avec le même cust et le sujet puis je dois retourner celui avec la date la plus élevée
  • Suite à ce qui précède, si les dates sont les mêmes, retournez seulement 1 d'entre eux.

Le résultat de la requête doit être:

cust subject date 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust4 Subject3 2011-02-27 21:59:59.000 
Cust5 Subject1 2010-10-31 21:59:59.000 
Cust5 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-12-31 21:59:59.000 

me aider Quelqu'un peut-il cela?

j'ai réussi à faire 2 des exigences, mais pas tous 3.

Répondre

0

Utilisez ROW_NUMBER() - si vous ne l'avez pas utilisé cela et les autres fonctions de partitionnement précédemment alors je vous recommande vraiment regarder en eux comme ils (en particulier ROW_NUMBER()) ont beaucoup d'utilisations.

SELECT cust, subject, date 
FROM (
    SELECT cust, subject, date, ROW_NUMBER() OVER (PARTITION BY cust, subject ORDER BY date DESC) AS RN 
    FROM <your table> 
) SubQuery 
WHERE SubQuery.RN = 1 
+0

Bien sûr, MAX ([date]) fonctionne ... ROW_NUMBER() est trop puissant. :) Pourtant, je l'aime! –

+0

Je pense que vous devez ajouter 'AS RN' sur la colonne numéro de ligne pour la clause' WHERE' pour fonctionner correctement ... –

+0

Merci beaucoup. La raison pour laquelle j'ai accepté ceci comme réponse est que j'ai oublié de mentionner que j'ai d'autres colonnes que je dois retourner ainsi que je ne les inclurai pas dans le groupe par et ne peux pas utiliser une fonction agrégée sur eux (comme le titre par exemple) et cela ne fonctionnerait pas avec le groupe normal par approche (du moins pas aussi facilement que celui-ci). Je vais jeter un coup d'oeil aux fonctions de partitionnement, elles semblent être un grand gain de temps. – HaniBey

5
SELECT cust, subject, max([date]) FROM myTable GROUP BY cust, subject; 

Vous n'avez pas vraiment une colonne appelée date, pensez-vous? date est un mot réservé, c'est pourquoi il a dû être entouré d'accolades carrées dans ma requête ci-dessus.

+2

Sweet'n'simple - +1! =) –

+1

+1 pour l'utilisation des mots de réserve. –

0
select cust, subject, max(date) from table group by cust, subject