我将每日股票数据存储在一个表格中,我希望能够查询诸如“过去5个交易日的数据是什么”之类的内容。问题是我没有周末或假期的数据,这会导致一天的数量。
从其他类似的问题我看到有些人有假期表存放假期,但我希望避免这种情况,因为我知道如果没有数据,那那天就是周末或假期。
我认为我能做到这一点的唯一方法是首先运行一个初始查询,按顺序枚举每个交易日,然后我可以运行查询,但我希望可能有更好的方法
答案 0 :(得分:3)
有一个'天表',每天有一行表,以及一个列,指明是否是交易日。实际上没有理由反对这个解决方案,它已被证明很多次之前很多次都是高效和正确的。不要试图超越这个简单的解决方案,你只会让自己痛苦。
答案 1 :(得分:1)
您最好的选择是使用DENSE_RANK选项,在交易日排名。下面的示例假设您使用的是SQL 2008。
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
公共表表达式是绝对必要的,但我将其格式化为使其更具可读性。如果您使用的是SQL 2005,则需要将转换更改为
CAST(FLOOR(CAST(trading_date AS FLOAT)) AS DATETIME)
仅检索日期时间字段的日期部分。当然,如果你使用2008并且你有一个DATE字段类型,那么你可以完全取消演员。