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.

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top