【问题标题】:sql query to get the last N trading days, not including weekends and holidayssql查询获取最近N个交易日,不包括周末和节假日
【发布时间】:2014-04-24 05:18:28
【问题描述】:

我将每日股票数据存储在一个表中,我希望能够查询“最近 5 个交易日的数据是什么”之类的内容。问题是我没有周末或节假日的数据,这会影响天数。

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

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

【问题讨论】:

标签: sql sql-server


【解决方案1】:

有一个“日表”,每一天都有一行的表格,以及一个指定是否是交易日的列。真的没有理由反对这个解决方案,它已经被证明是有效和正确的。不要试图智取这个简单的解决方案,你只会给自己带来痛苦。

【讨论】:

  • 谢谢 Remus,在阅读了上面的链接后,我想最好的做法是有一个单独的表,所以我会走那条路。
【解决方案2】:

您最好的选择是使用 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 字段类型开头,则可以完全取消强制转换。

【讨论】:

  • 谢谢彼得,我会尝试这个,但是,看起来我会走单独的桌子路线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多