Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

TSQL-Abfrage, um auf vorherige Zeilen zu verweisen

Für SQL Server 2012+:

Sie können die LAG verwenden Funktion.

Hier ist ein Beispiel, um den zuvor empfangenen Wert zu finden, dann wären die anderen natürlich ziemlich gleich.

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

Ansonsten

Ich war schon gut in diese Antwort versunken, bevor Sie zurückkommentierten, also habe ich einfach weitergemacht.

Sie müssen einen CTE verwenden und ihn durch den gesuchten Offset der Zeilennummer mit sich selbst verbinden.

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