Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête TSQL pour référencer les lignes précédentes

Pour SQL Server 2012+ :

Vous pouvez utiliser le LAG fonction.

Voici un exemple pour trouver la valeur reçue précédente, alors bien sûr les autres seraient à peu près les mêmes.

SELECT      TOP 5 
            ReceivedYTD, 
            InvoicedYTD, 
            OrderedYTD, 
            YearReported, 
            WeekReported,

-- Relevant part
            LAG(ReceivedYTD)
                OVER (ORDER BY YearReported DESC, WeekReported DESC) AS PreviousReceivedYTD
-- End relevant part

FROM        Products 
WHERE       ProductId = @ProductId
ORDER BY    YearReported DESC, 
            WeekReported DESC

Sinon

J'étais déjà bien avancé dans cette réponse avant que vous ne commentiez, alors je me suis contenté d'y aller.

Vous devez utiliser un CTE et le joindre à lui-même par le décalage du numéro de ligne que vous recherchez.

WITH CTE AS (
    SELECT      TOP 5 
                RowNumber = ROW_NUMBER() OVER (ORDER BY YearReported DESC, WeekReported DESC)

                ReceivedYTD, 
                InvoicedYTD, 
                OrderedYTD, 
                YearReported, 
                WeekReported,
    FROM        Products 
    WHERE       ProductId = @ProductId
    ORDER BY    YearReported DESC, 
                WeekReported DESC
)

SELECT   CTE.ReceivedYTD, 
         CTE.InvoicedYTD, 
         CTE.OrderedYTD, 
         CTE.YearReported,
         CTE.WeekReported,
         PreviousRow.ReceivedYTD AS PreviousReceivedYTD
FROM CTE
    LEFT OUTER JOIN CTE PreviousRow ON CTE.RowNumber - 1 = PreviousRow.RowNumber