SQL Server Row_Number() 序列不跳过 NULL 或 0 值来计算工作日

问题描述 投票:0回答:1

我正在尝试在 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
sql sql-server row-number
1个回答
0
投票

简单地执行您所说的操作可能是一个更直观的解决方案:跳过非工作日行的计算,但使用

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)和列名。

© www.soinside.com 2019 - 2024. All rights reserved.