Seleziona l'ultima revisione di ogni riga in una tabella
-
07-07-2019 - |
Domanda
Ho strutture di tabella che includono una chiave primaria composita di id & amp; revisione in cui entrambi sono numeri interi.
Ho bisogno di una query che restituisca l'ultima revisione di ogni riga. Se avessi capito questo rispondere correttamente, quindi quanto segue avrebbe funzionato su un Oracle DB.
SELECT Id, Title
FROM ( SELECT Id, Revision, MAX(Revision) OVER (PARTITION BY Id) LatestRevision FROM Task )
WHERE Revision = LatestRevision
Sto usando SQL Server (2005) e ho bisogno di una query performante per fare lo stesso.
Soluzione
Vedi this post di ayende per la realizzazione delle migliori strategie.
Altri suggerimenti
Penso che dovrebbe funzionare (non l'ho provato) ...
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
Vorrei provare a creare una sottoquery come questa:
SELEZIONA ID, Titolo DA Attività T, (Seleziona ID, Max (Revisione) MaxRev dal gruppo di attività per ID) Più recenteT DOVE T.Revision = LatestT.MaxRev e T.ID = LatestT.ID
Un'altra opzione è "cheat" e creare un trigger che contrassegnerà la revisione come ultima revisione se viene aggiunto un elemento. Quindi aggiungi quel campo all'indice. (Vorrei collegare la tabella per inserire solo)
Anche un indice su ID, la descrizione della revisione potrebbe aiutare le prestazioni
La query che hai pubblicato funzionerà in SQL 2005 (in modalità compatibilità 90) con gli errori di sintassi corretti:
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
prova questo:
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
USCITA:
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)