web-dev-qa-db-fra.com

Est-il possible d'utiliser ROW_NUMBER () OVER / PARTITION BY uniquement lorsqu'une autre colonne est également la même?

J'utilise ce code: (à partir de cette question: Comment obtenir le dernier enregistrement par groupe en SQL en remplaçant mes propres colonnes)

WITH e AS
(
 SELECT *,
     ROW_NUMBER() OVER
     (
         PARTITION BY ApplicationId
         ORDER BY theDate DESC
     ) AS Recency
 FROM [Event]
)
SELECT *
FROM e
WHERE Recency = 1

Est-il possible de "partitionner" uniquement si deux champs sont identiques? Par exemple, j'ai des données comme celle-ci:

ID      Name    theDate
123     John    01/01/2012
123     John    01/02/2012
123     Doe     01/01/2012
456     Smith   02/04/2012
789     Smith   02/01/2012
789     Smith   02/09/2012
789     Roger   02/08/2012

À partir de ces données, je voudrais revenir:

ID      Name    theDate
123     John    01/02/2012
123     Doe     01/01/2012
456     Smith   02/04/2012
789     Smith   02/09/2012
789     Roger   02/08/2012

Merci pour toute aide.

Thomas

13
tsdexter

Je l'ai trouvé la réponse ici: Partitionnement de table en utilisant 2 colonnes

Vous ne pouvez partitionner que sur 1 colonne, mais cette colonne peut être générée pour créer une "partition multiple" comme ceci:

WITH e AS 
( 
 SELECT *, 
 ROW_NUMBER() OVER 
 ( 
     PARTITION BY CONVERT(VARCHAR(100),ApplicationId) + ' ' + Name
     ORDER BY theDate DESC 
 ) AS Recency 
 FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

L'ajout des deux colonnes en une seule chaîne garantit qu'il ne sera partitionné que si les deux colonnes sont identiques.

3
tsdexter

Vous pouvez avoir plusieurs colonnes séparées par une virgule

WITH e AS 
( 
 SELECT *, 
     ROW_NUMBER() OVER 
     ( 
         PARTITION BY ApplicationId , Name
         ORDER BY theDate DESC 
     ) AS Recency 
 FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 
32
JeffO