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.

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top