sql - 前两天选择多行?
问题描述
我想做一个 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,因为它在上面解释过,前一天可能是假期或周末。
任何建议或想法将不胜感激。
解决方案
您想要的结果集的价格在单独的列中,而不是单独的行中。这表明条件聚合:
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)
.
推荐阅读
- c# - MigraDoc 单元格背景颜色问题
- php - 如何列出由草稿与已发布过滤的所有文字新闻页面及其 URL?
- angularjs - 如何监视我正在测试的服务的功能?
- r - 如何减去构造相同长度向量的列表
- ruby-on-rails - 如何使用水豚检查特定 html 元素中的 css 类名?
- google-apps-script - 谷歌表格 - 希望在输入日期超过今天的日期后隐藏行
- c# - c#在公共静态类中循环
- powershell - PowerShell 脚本到 Get-RemotePrograms 并导出到 .CSV 用于多个 AD 计算机对象不能批量工作?
- shell - 如何限制AZ和1-9之间的密码
- python - 这段代码似乎不起作用为什么我不感到困惑