Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać poprzednią i bieżącą wartość wiersza za pomocą rekurencyjnego CTE?

Zakłada to zwiększenie wartości ID i rozwiąże luki w ID

SELECT
   ID, 
   This.Number AS CurrentValue, 
   Prev2.Number AS PreviousValue
FROM
   myTable This
   OUTER APPLY
   (
    SELECT TOP 1
       Number
    FROM
       myTable Prev
    WHERE
       Prev.ID < This.ID  -- change to number if you want
    ORDER BY
       Prev.ID DESC
   ) Prev2;

LUB

WITH CTE
     AS (SELECT ID,
                Number,
                ROW_NUMBER() OVER (ORDER BY ID) AS rn
         FROM   Mytable)
SELECT ID,
       This.Number AS CurrentValue,
       Prev.Number AS PreviousValue
FROM   CTE This
       LEFT JOIN CTE Prev
         ON Prev.rn + 1 = This.rn; 

Oraz dla SQL Server 2012

SELECT
   ID,
   Number AS CurrentValue,
   LAG(Number) OVER (ORDER BY ID) AS PreviousValue
FROM
   MyTable



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie, aby znaleźć listę *wszystkich* zestawów danych SSRS we *wszystkich* raportach SSRS w instancji ReportServer

  2. Indeks na kolumnie bitowej

  3. Nie możesz użyć tymczasowej kolumny w klauzuli where?

  4. Entity Framework/Linq to SQL:Pomiń i weź

  5. Czy można usunąć z klauzulą ​​HAVING?