我正在尝试使用预定义的INT值,将1或0作为工作日或不计算滚动工作日序列。我尝试了很多不同的代码,并在这里检查了不同的帖子,但没有一个具体到足以与我合作。
预定义的INT值是“business_day_flag_int”。这来自转换计算,给我“day_business_day_flag”这是一个有点值。目前星期六/星期日和银行假日触发0为“day_business_day_flag”,而周一至周五为非假日给它1值。
如何在Update表中将其设置为可以添加到表生成文件的其余部分?如果需要更多信息,请告诉我。
我尝试过一系列不同的改动和变化。如果我删除日期值,它会为大约12600个工作日的列中的所有行提供一个int值。如果我使用它给我的日期范围
DECLARE @StartDate DATETIME = '01/01/2000' --Starting value of Date Range
DECLARE @EndDate DATETIME = '01/01/2050' --End Value of Date Range
DECLARE
@DayOfWeekInMonth INT,
@DayOfWeekInYear INT,
@DayOfQuarter INT,
@WeekOfMonth INT,
@CurrentYear INT,
@CurrentMonth INT,
@CurrentQuarter INT
DECLARE @CurrentDate AS DATETIME = @startDate
SET @CurrentMonth = DATEPART(MM, @CurrentDate)
SET @CurrentYear = DATEPART(YY, @CurrentDate)
SET @CurrentQuarter = DATEPART(QQ, @CurrentDate)
UPDATE [EDW_MDM].[dbo].[CALENDAR_DIM] SET
business_day_flag_int = Convert(INT, day_business_day_flag)
UPDATE [EDW_MDM].[dbo].[CALENDAR_DIM] SET
rolling_business_day_sequence = (SELECT count(business_day_flag_int) FROM [EDW_MDM].[dbo].[CALENDAR_DIM]
WHERE business_day_flag_int = 1 and
day_date between @StartDate and @CurrentDate)
我希望列“rolling_business_day_sequence”按顺序计算过去的工作日。例如,第1行= 1,第2行= 2等。直到我的日历结束。
更新1:编辑代码行
UPDATE [EDW_MDM].[dbo].[FCFCU_CALENDAR_DIM] SET
rolling_business_day_sequence = datediff(day,@StartDate,day_date) WHERE day_business_day_flag = 1
这给了我计算天数并将rolling_business_day_sequence行值设置为null,其中没有day_busienss_day_flag = 1且仍在计算它们而不是不计算它们。我怎么能让它不添加一天?
考虑WHERE
条件下的窗口函数和,以累计计算指定日期范围内的所有business_day_flag_int = 1
实例。但是,要在UPDATE
中使用窗口函数,需要CTE或子查询。
WITH CTE AS
(
SELECT ID, SUM(CASE WHEN day_date BETWEEN @StartDate AND @CurrentDate
AND business_day_flag_int = 1
THEN 1
ELSE 0
END) OVER (ORDER BY day_date) AS running_sequence
FROM [EDW_MDM].[dbo].[CALENDAR_DIM]
)
UPDATE t
FROM [EDW_MDM].[dbo].[CALENDAR_DIM] t
JOIN CTE ON t.ID = CTE.ID
SET t.rolling_business_day_sequence = CTE.running_sequence