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

Jak samostatně spojit tabulku tak, aby se každý záznam spojil s předchozím záznamem?

Jednou z možností je použít rekurzivní cte (pokud správně rozumím vašim požadavkům):

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

Ukázka SQL Fiddle

Pokud potřebujete průběžný součet pro každý symbol, který chcete použít jako procentuální změnu, pak je dost snadné přidat další sloupec pro tuto částku – nebyl jsem si zcela jistý, jaké byly vaše záměry, takže výše pouze vydělí aktuální uzavřenou částku předchozí uzavřená částka.



  1. Jak odstranit záznamy v DB pomocí mySQL pomocí group by

  2. Seřadit a seskupit výsledky podle data

  3. Vytvoření aplikace Java v Oracle JDeveloper, část 1

  4. 'PDOException' se zprávou 'SQLSTATE[22001]:Data řetězce, vpravo zkrácena:0