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

Wie kann man einer Tabelle selbst beitreten, sodass jeder Datensatz mit dem vorherigen Datensatz verknüpft wird?

Eine Option ist die Verwendung eines rekursiven cte (wenn ich Ihre Anforderungen richtig verstehe):

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

Wenn Sie eine laufende Summe für jedes Symbol benötigen, das als prozentuale Änderung verwendet werden soll, können Sie einfach eine zusätzliche Spalte für diesen Betrag hinzufügen - war sich nicht ganz sicher, was Ihre Absichten waren, also dividiert das obige nur den aktuellen geschlossenen Betrag durch vorheriger abgeschlossener Betrag.