我将每日股票数据存储在一个表中,我希望能够查询类似于“过去5个交易日的数据是什么”之类的内容。问题是,我没有周末或节假日的数据,这使得我无法计算天数。
从其他类似的问题中,我看到一些人有一个假日表来存储假日,但我希望避免这种情况,因为我知道如果没有数据,那么那一天就是周末或假日。
我认为我能做到这一点的唯一方法是首先运行一个初始查询,该查询按顺序枚举每个交易日,然后我可以以这种方式运行查询,但我希望可能有更好的方法。
发布于 2012-03-27 08:44:53
有一个“天数表”,表中每一天都有一行,并有一列指定是否是交易日。真的没有理由反对这个解决方案,它已经被多次证明是有效和正确的。不要试图智胜这个简单的解决方案,你只会给自己带来痛苦。
发布于 2012-03-27 19:48:44
你最好的选择是使用DENSE_RANK选项,在交易日排名。下面的例子假设你使用的是SQL2008。
CREATE TABLE #test (id INT IDENTITY(1, 1), trading_date DATETIME, stock_key INT, stock_count INT)
;WITH dates AS(SELECT DISTINCT DENSE_RANK() OVER (ORDER BY CAST(trading_date AS DATE) DESC) AS days_ago,
CAST(trading_date AS DATE) AS trading_date FROM #test)
SELECT t.* FROM #test t, dates d
WHERE d.days_ago = 5 AND t.trading_date >= d.trading_date
公用表表达式是严格必需的,但为了使其更具可读性,我将其格式化为这样的格式。如果您使用的是SQL2005,则需要将强制转换更改为
CAST(FLOOR(CAST(trading_date AS FLOAT)) AS DATETIME)
仅检索datetime字段的日期部分。当然,如果您使用的是2008,并且您一开始就有一个日期字段类型,那么您可以完全取消强制转换。
https://stackoverflow.com/questions/9881863
复制相似问题