【问题标题】:Top two days select for multiple rows?前两天选择多行?
【发布时间】:2021-07-10 09:08:26
【问题描述】:

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

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

关于数据的注释:

  • 最大日期将是“当前日期” - 但这并不意味着它是今天,因为周末和节假日不是交易日,不会有针对它的价格。
  • Previous Date 不是 CurrentDate - 例如,1,正如上面解释的那样,前一天可能是假期或周末。

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

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql sql-server azure-sql-database


【解决方案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)上添加一个索引。

【讨论】:

  • 太棒了,谢谢!我的小 5 DTU Azure DB 中的性能是 2 秒,而领先的是 12 秒 :)
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多