多行的前两天 select?

Top two days select for multiple rows?

我有一个 table 的股票价格如下:

我想做一个 SQL 语句来获取给定股票代码的当前最新价格和之前的价格。

我可以针对每只股票单独执行此操作,如下所示:

  SELECT TOP 2 * FROM StockPrices WHERE TickerId = 'XASX:360' ORDER BY Date DESC

但是由于显而易见的原因,当有多个自动收报机时,这将不起作用。

我需要这样的东西:

| TickerId  | Current CLOSE Price | Previous CLOSE Price |
| XASX:360  | 7.01                | 7.03                 |
| XASX:A200 | 123.92              | 123                  |
|  ....  etc .......                                     |
| XASX:AAC  | 1.38                | 1.365                |

另一种方法甚至可以只获取最新日期和之前的日期。

| TickerId  | Current Trade Date | Previous Trade Date |
| XASX:360  | 2021-07-09         | 2021-07-08          |
| XASX:A200 | 2021-07-09         | 2021-07-08          |
| XASX:A2M  | 2021-07-09         | 2021-07-08          |
|  ....  etc .......                                   |

数据说明:

如有任何建议或想法,我们将不胜感激。

You can achieve you result using LEAD function in MS SQL SERVER. using following query just need to replace your column name from your table.     

SELECT 
            TICKERID,
            CURRENTCLOSEPRICE,
            PREVIOUSCLOSEPRICE 
            FROM ( 
                    SELECT 
                        ROW_NUMBER() OVER(PARTITION BY TICKERID ORDER BY TICKERDATE DESC) AS SR,    
                        TICKERID,
                        CLOSEPRICE AS CURRENTCLOSEPRICE,
                        LEAD(CLOSEPRICE, 1) OVER(PARTITION BY TICKERID ORDER BY TICKERDATE DESC) AS PREVIOUSCLOSEPRICE
                        FROM STOCKPRICES 
            ) AS TBL 
    WHERE SR=1

您想要的结果集在单独的列而不是单独的行中包含价格。这表明条件聚合:

SELECT TICKERID,
       MAX(CASE WHEN SEQNUM = 1 THEN CLOSEPRICE END) as CURRENT_CLOSEPRICE,
       MAX(CASE WHEN SEQNUM = 2 THEN CLOSEPRICE END) as  PREVIOUS_CLOSEPRICE,
       MAX(TICKERDATE) AS CURRENT_TRADEDATE,
       MIN(TICKERDATE) AS PREVIOUS_TRADEDATE
FROM (SELECT SP.*,
             ROW_NUMBER() OVER (PARTITION BY TICKERID ORDER BY TICKERDATE DESC) AS SEQNUM
      FROM STOCKPRICES SP
     ) SP
WHERE SEQNUM <= 2
GROUP BY TICKERID;   

然后为了性能,你可以在(TICKERID, TICKERDATE DESC)上添加一个索引。