我正在尝试在 SQL Server 中的现有日期维度中创建工作日字段,以提取一个月中的第 n 个工作日。到目前为止,我已经研究了解决方案,并为工作日创建了一个字段,其中周末= 0,工作日= 1。我使用 Row_Number() 生成一个序列来指示第 n 个工作日。但是我的问题是 Row_Number () 序列未按预期计算,因为它不会跳过 0 值并继续序列。有人有解决办法吗?谢谢。
SELECT DATE_KEY_YYYYMM
,[Date KEY]
,[Day of Week Short Name]
,[Day of Week Number]
,CASE WHEN [Day of Week Number] IN (1,2,3,4,5) THEN 1 ELSE 0 END AS BusinessDay
,CASE WHEN [Day of Week Number] IN (6,7) THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY [Date_Key_YYYYMM] ORDER BY [Date Key]) END AS [RowCount]
FROM [DIM].[Call Date]
输出
日期键 YYYY | 日期 | 星期几 | 工作日 | 行数 |
---|---|---|---|---|
201404 | 20140401 | 周二 | 1 | 1 |
201404 | 20140402 | 周三 | 1 | 2 |
201404 | 20140403 | 周四 | 1 | 3 |
201404 | 20140404 | 周五 | 1 | 4 |
201404 | 20140405 | 周六 | 0 | 空 |
201404 | 20140406 | 太阳 | 0 | 空 |
201404 | 20140407 | 周一 | 1 | 7 |
正确的输出 - 我需要
日期键 YYYY | 日期 | 星期几 | 工作日 | 行数 |
---|---|---|---|---|
201404 | 20140401 | 周二 | 1 | 1 |
201404 | 20140402 | 周三 | 1 | 2 |
201404 | 20140403 | 周四 | 1 | 3 |
201404 | 20140404 | 周五 | 1 | 4 |
201404 | 20140405 | 周六 | 0 | 空 |
201404 | 20140406 | 太阳 | 0 | 空 |
201404 | 20140407 | 周一 | 1 | 5 |
简单地执行您所说的操作可能是一个更直观的解决方案:跳过非工作日行的计算,但使用
SUM() OVER()
。例如:
;WITH src AS
(
SELECT [Date Key YYYY], [Date], [Day of Week],
BusinessDay = CASE WHEN DATEPART(WEEKDAY, [Date]) IN (1,7)
THEN 0 ELSE 1 END
FROM [Date Dim]
)
SELECT [Date Key YYYY], [Date], [Day of Week], BusinessDay,
[RowCount] = CASE WHEN BusinessDay = 1 THEN SUM(BusinessDay)
OVER (ORDER BY [Date]) END
FROM src;
虽然有一些建议:
为什么要在查询中计算工作日?这可以是表中的一个简单的计算列。或者手动应用,因为您可能还想考虑政府假期、企业停业等。
尽量避免使用违反
标识符规则的关键字(如
Date
)和列名。