sql >> Databasteknik >  >> RDS >> Sqlserver

Hur går man själv med i tabellen på ett sätt så att varje post sammanfogas med den tidigare posten?

Ett alternativ är att använda en rekursiv cte (om jag förstår dina krav rätt):

WITH RNCTE AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY date) rn
        FROM quotes
  ),
CTE AS (
  SELECT symbol, date, rn, cast(0 as decimal(10,2)) perc, closed
  FROM RNCTE
  WHERE rn = 1
  UNION ALL
  SELECT r.symbol, r.date, r.rn, cast(c.closed/r.closed as decimal(10,2)) perc, r.closed
  FROM CTE c 
    JOIN RNCTE r on c.symbol = r.symbol AND c.rn+1 = r.rn
  )
SELECT * FROM CTE
ORDER BY symbol, date

SQL Fiddle Demo

Om du behöver en löpande summa för varje symbol att använda som den procentuella förändringen är det lätt att lägga till en extra kolumn för det beloppet -- var inte helt säker på vad dina avsikter var, så ovanstående delar bara det nuvarande stängda beloppet med tidigare stängt belopp.



  1. Hur man får gårdagens datum i PostgreSQL

  2. Hur hanterar man en Empty IN-sats i en SQL Select-sats (IBatis 2)?

  3. Transformera ODBC-data i CloverDX

  4. Skicka kolumnnamn dynamiskt för en postvariabel i PostgreSQL