我非常需要计算非交易日的乘数。所以说例如:如果假日在星期三,那么第二天(星期四)的乘数将是2(星期四+星期四)如果假日是星期一,那么星期二应该有乘数4(即星期六+星期日+星期一+星期二) )对于正常的周末,周一应该有多个因子3(即星期六+太阳+星期一)和正常工作日,乘数因子是1
为了解决这个问题,我创建了标准日期维度,带有假日标志(周末和公共假期将为1)并创建名为MULTIPLIER的列,其值应为正常工作日 - 乘数值应为1如果假日是在星期三(5月28日),那么在星期四(5月29日),乘数因子将是2(即星期日的星期五列数和当天的1 + 1(即1 + 1)和假日是星期一( 6月2日)然后在6月3日它将是IsHoliday标志的总和(即星期六为1 +太阳+ 1为星期一,并且将这3个假日标志加起来它将是当天的3 + 1所以它将是4)
如果有人可以帮助我解决这个谜团,那真的很棒
注意:我使用的是SQL Server 2012
答案 0 :(得分:0)
CREATE Table DateTable (
[date] datetime NOT NULL
,IsHoliday int NOT NULL
);
INSERT INTO DateTable
VALUES ('20140101', 1) -- Just example, not real holidays
,('20140102', 0)
,('20140103', 0)
,('20140104', 0)
,('20140105', 1)
,('20140106', 1)
,('20140107', 1)
,('20140108', 0);
WITH HolidayGaps AS (
SELECT [Date]
,DaysFromStart
,DaysFromStart - ROW_NUMBER() OVER (ORDER BY Date) AS Gap
FROM DateTable
CROSS APPLY (
SELECT DATEDIFF(day, '20140101', [Date]) AS DaysFromStart
) AS CA1
WHERE IsHoliday = 1
)
,DayAfterHoliday AS (
SELECT DATEADD(day, 1, MAX([date])) AS [date]
,COUNT(1) AS Multiplier
FROM HolidayGaps
GROUP BY Gap
)
SELECT *
FROM DayAfterHoliday
您的更新语句类似于
UPDATE DateTable
SET Multiplier = CASE WHEN DateTable.IsHoliday = 1 THEN 0
ELSE COALESCE(DayAfterHoliday.Multiplier, 1)
END
FROM DateTable
LEFT JOIN DayAfterHoliday
ON DayAfterHoliday.Date = DateTable.Date