多行的前两天 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 ....... |
数据说明:
- 最大日期将是“当前日期”- 但这并不意味着它是今天,因为周末和节假日不是交易日并且不会有反对它的价格。
- Previous Date 不是 CurrentDate - 例如 1,如上所述,前一天可能是假期或周末。
如有任何建议或想法,我们将不胜感激。
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)
上添加一个索引。
我有一个 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 ....... |
数据说明:
- 最大日期将是“当前日期”- 但这并不意味着它是今天,因为周末和节假日不是交易日并且不会有反对它的价格。
- Previous Date 不是 CurrentDate - 例如 1,如上所述,前一天可能是假期或周末。
如有任何建议或想法,我们将不胜感激。
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)
上添加一个索引。