How to self-join table in a way that every record is joined with the “previous” record?

后端 未结 7 1259
清歌不尽
清歌不尽 2021-01-02 06:55

I have a MS SQL table that contains stock data with the following columns: Id, Symbol, Date, Open, High, Low, Close.

I would like to self-join the table

7条回答
  •  天命终不由人
    2021-01-02 07:11

    You can use option with CTE and ROW_NUMBER ranking function

     ;WITH cte AS
     (
      SELECT symbol, date, [Open], [High], [Low], [Close],
             ROW_NUMBER() OVER(PARTITION BY symbol ORDER BY date) AS Id
      FROM quotes
      )
      SELECT c1.Id, c1.symbol, c1.date, c1.[Open], c1.[High], c1.[Low], c1.[Close], 
             ISNULL(c2.[Close] / c1.[Close], 0) AS perc
      FROM cte c1 LEFT JOIN cte c2 ON c1.symbol = c2.symbol AND c1.Id = c2.Id + 1
      ORDER BY c1.symbol, c1.date
    

    For improving performance(avoiding sorting and RID Lookup) use this index

    CREATE INDEX ix_symbol$date_quotes ON quotes(symbol, date) INCLUDE([Open], [High], [Low], [Close])
    

    Simple demo on SQLFiddle

提交回复
热议问题