Sélectionner la dernière révision de chaque ligne d'un tableau
-
07-07-2019 - |
Question
J'ai des structures de table qui incluent une clé primaire composite id & amp; révision où les deux sont des entiers.
J'ai besoin d'une requête qui renverra la dernière révision de chaque ligne. Si j'ai bien compris cette Si vous répondez correctement , les éléments suivants auraient fonctionné avec une base de données Oracle.
SELECT Id, Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task )
WHERE Revision = LatestRevision
J'utilise SQL Server (2005) et j'ai besoin d'une requête performante pour faire de même.
La solution
Voir ceci post by ayende pour une évaluation des meilleures stratégies.
Autres conseils
Je pense que cela devrait fonctionner (je ne l'ai pas testé) ...
SELECT ID,
Title
FROM Task AS T
INNER JOIN
(
SELECT ID,
Max(Revision)
FROM Task
GROUP BY ID
) AS sub
ON T.ID = sub.ID
AND T.Revision = sub.Revision
Je voudrais essayer de créer une sous-requête comme celle-ci:
SELECT Id, Titre FROM Task T, (Select ID, Max (Révision) MaxRev du groupe de tâches par ID) LatestT WHERE T.Revision = LatestT.MaxRev et T.ID = LatestT.ID
Une autre option consiste à "tricher". et créez un déclencheur qui marquera la révision comme dernière révision si un élément est ajouté. Ajoutez ensuite ce champ à l'index. (Je lierais uniquement le tableau pour l'insérer)
Également un index sur l'ID, Revision desc pourrait améliorer les performances
La requête que vous avez publiée fonctionnera dans SQL 2005 (en mode de compatibilité 90) avec les erreurs de syntaxe corrigées:
SELECT t1.Id, t1.Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task ) AS x
JOIN Task as t1
ON t1.Revision = x.LatestRevision
AND t1.id = x.id
essayez ceci:
DECLARE @YourTable table(RowID int, Revision int, Title varchar(10))
INSERT INTO @YourTable VALUES (1,1,'A')
INSERT INTO @YourTable VALUES (2,1,'B')
INSERT INTO @YourTable VALUES (2,2,'BB')
INSERT INTO @YourTable VALUES (3,1,'C')
INSERT INTO @YourTable VALUES (4,1,'D')
INSERT INTO @YourTable VALUES (1,2,'AA')
INSERT INTO @YourTable VALUES (2,3,'BBB')
INSERT INTO @YourTable VALUES (5,1,'E')
INSERT INTO @YourTable VALUES (5,2,'EE')
INSERT INTO @YourTable VALUES (4,2,'DD')
INSERT INTO @YourTable VALUES (4,3,'DDD')
INSERT INTO @YourTable VALUES (6,1,'F')
;WITH YourTableRank AS
(
SELECT
RowID,Revision,Title, ROW_NUMBER() OVER(PARTITION BY RowID ORDER BY RowID,Revision DESC) AS Rank
FROM @YourTable
)
SELECT
RowID, Revision, Title
FROM YourTableRank
WHERE Rank=1
SORTIE:
RowID Revision Title
----------- ----------- ----------
1 2 AA
2 3 BBB
3 1 C
4 3 DDD
5 2 EE
6 1 F
(6 row(s) affected)