创建有条件递增的值 - SQL Server

金砖四国

我有一个包含连续日期列表的表格。该表还有一个日期类型字段,包括:工作日 (B)、星期六 (X)、星期日 (Y) 和假日 (H)

我想添加一个具有递增数字的附加列。只有在以下情况下,数字才会增加:

  • 这是列表中的第一天,也是一个工作日。
  • 前一天是一个工作日。

预期结果:

DATE         DAY_TYPE   NUMBER
2017-03-09   B          1
2017-03-10   B          2
2017-03-11   X          3
2017-03-12   Y          3
2017-03-13   H          3
2017-03-14   B          3
2017-03-15   B          4
2017-03-16   H          5
2017-03-17   B          5
马扎尔

您可以使用递归公用表表达式执行此操作

DECLARE @sample TABLE ( [date] DATE, day_type CHAR(1))
INSERT @sample
( [date], day_type )
VALUES
('2017-03-09','B')
,('2017-03-10','B')
,('2017-03-11','X')
,('2017-03-12','Y')
,('2017-03-13','H')
,('2017-03-14','B')
,('2017-03-15','B')
,('2017-03-16','H')
,('2017-03-17','B')

;WITH cteSample
AS(
SELECT
      ROW_NUMBER()OVER(ORDER BY [S].[date]) 'RN'
    , S.[date]
    , S.day_type
FROM @sample S
),cteRecursive
AS(
    SELECT
        b.RN, b.[date], b.day_type, 1 'Number'
    FROM
        cteSample b
    WHERE
        b.RN = 1 AND b.day_type = 'B'
    UNION ALL
    SELECT
         e.RN, e.[date], e.day_type
        ,CASE WHEN ( e.day_type IN ('B') AND r.day_type IN ('B') OR e.day_type NOT IN ('B') AND r.day_type IN ('B') )
             THEN r.Number + 1 ELSE r.Number END
    FROM
        cteSample  e
    INNER JOIN
        cteRecursive r ON e.RN = r.rn + 1
    )
SELECT * FROM cteRecursive

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章