首页 > 解决方案 > 前两天选择多行?

问题描述

我有一张这样的股票价格表: 股票数据样本

我想做一个 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 .......                                   |

关于数据的注释:

任何建议或想法将不胜感激。

标签: sqlsql-serverazure-sql-database

解决方案


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

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).


推荐阅读