sql查询获取最后N个交易日,不包括周末和假日

时间:2012-03-27 00:42:05

标签: sql sql-server

我将每日股票数据存储在一个表格中,我希望能够查询诸如“过去5个交易日的数据是什么”之类的内容。问题是我没有周末或假期的数据,这会导致一天的数量。

从其他类似的问题我看到有些人有假期表存放假期,但我希望避免这种情况,因为我知道如果没有数据,那那天就是周末或假期。

我认为我能做到这一点的唯一方法是首先运行一个初始查询,按顺序枚举每个交易日,然后我可以运行查询,但我希望可能有更好的方法

2 个答案:

答案 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字段类型,那么你可以完全取消演员。