计算非交易​​日的运行总额以处理周末和假日

时间:2014-05-27 04:24:43

标签: sql-server tsql sql-server-2012 running-total

我非常需要计算非交易​​日的乘数。所以说例如:如果假日在星期三,那么第二天(星期四)的乘数将是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

1 个答案:

答案 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