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
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.
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