sql >> Databáze >  >> RDS >> Sqlserver

TSQL dotaz pro odkaz na předchozí řádky

Pro SQL Server 2012+:

Můžete použít LAG funkce.

Zde je příklad pro nalezení předchozí přijaté hodnoty, pak by samozřejmě ostatní byly docela stejné.

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

Jinak

Tuto odpověď jsem dobře znal, než jste se vyjádřil, takže jsem do toho šel.

Musíte použít CTE a spojit jej proti sobě pomocí posunutí čísla řádku, který hledáte.

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


  1. Jak nastavit SQL Server / IIS 7.0, aby web ASP.NET MVC měl přístup k databázi?

  2. Ignorujte duplicitní položky a potvrďte ty úspěšné pomocí DbContext.SaveChanges() v EF Core

  3. Jak vložit data z jedné databázové tabulky do jiné databázové tabulky v Mysql

  4. Pokročilý archiv novinek Roky/měsíc pomocí PHP MySql