break row_number() 基于标志变量的序列
break row_number() sequence based on flag variable
希望有所收获。
我有如下数据
id month flag
111 jan 1
111 feb 1
111 mar 1
111 apr 0
111 may 0
111 jun 1
222 jan 1
222 feb 1
222 mar 0
222 apr 0
222 may 0
222 jun 1
我正在寻找如下输出
id month flag order
111 jan 1 1
111 feb 1 2
111 mar 1 3
111 apr 0 1
111 may 0 2
111 jun 1 1
222 jan 1 1
222 feb 1 2
222 mar 0 1
222 apr 0 2
222 may 0 3
222 jun 1 1
我试过row_number()
,但问题是我们不能打破顺序重新开始。总的来说,每当标志变量从 0 到 1 或 1 到 0 发生变化时,我需要分别从 1 开始为每个 id 计数
假设SQL服务器,这里是一个例子:
DECLARE @T table (id int, [month] char(3), flag bit)
INSERT INTO @T
VALUES
(111, 'jan', 1)
,(111, 'feb', 1)
,(111, 'mar', 1)
,(111, 'apr', 0)
,(111, 'may', 0)
,(111, 'jun', 1)
,(222, 'jan', 1)
,(222, 'feb', 1)
,(222, 'mar', 0)
,(222, 'apr', 0)
,(222, 'may', 0)
,(222, 'jun', 1)
SELECT
id
, [month]
, flag
, ROW_NUMBER() OVER (PARTITION BY id, section ORDER BY monthNum) [order]
FROM
(
SELECT
id
, [month]
, monthNum
, flag
, SUM(CASE WHEN newValue = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY monthNum) section
FROM
(
SELECT
id
, [month]
, monthNum
, flag
, CASE WHEN LAG(flag, 1, ABS(flag - 1)) OVER (PARTITION BY id ORDER BY monthNum) = flag THEN 0 ELSE 1 END newValue
FROM
(
SELECT
id
, [month]
, MONTH(CAST('1 ' + [month] + ' 17' AS datetime)) monthNum
, flag
FROM @T
) Q
) Q2
) Q3
希望有所收获。
我有如下数据
id month flag
111 jan 1
111 feb 1
111 mar 1
111 apr 0
111 may 0
111 jun 1
222 jan 1
222 feb 1
222 mar 0
222 apr 0
222 may 0
222 jun 1
我正在寻找如下输出
id month flag order
111 jan 1 1
111 feb 1 2
111 mar 1 3
111 apr 0 1
111 may 0 2
111 jun 1 1
222 jan 1 1
222 feb 1 2
222 mar 0 1
222 apr 0 2
222 may 0 3
222 jun 1 1
我试过row_number()
,但问题是我们不能打破顺序重新开始。总的来说,每当标志变量从 0 到 1 或 1 到 0 发生变化时,我需要分别从 1 开始为每个 id 计数
假设SQL服务器,这里是一个例子:
DECLARE @T table (id int, [month] char(3), flag bit)
INSERT INTO @T
VALUES
(111, 'jan', 1)
,(111, 'feb', 1)
,(111, 'mar', 1)
,(111, 'apr', 0)
,(111, 'may', 0)
,(111, 'jun', 1)
,(222, 'jan', 1)
,(222, 'feb', 1)
,(222, 'mar', 0)
,(222, 'apr', 0)
,(222, 'may', 0)
,(222, 'jun', 1)
SELECT
id
, [month]
, flag
, ROW_NUMBER() OVER (PARTITION BY id, section ORDER BY monthNum) [order]
FROM
(
SELECT
id
, [month]
, monthNum
, flag
, SUM(CASE WHEN newValue = 1 THEN 1 ELSE 0 END) OVER (PARTITION BY id ORDER BY monthNum) section
FROM
(
SELECT
id
, [month]
, monthNum
, flag
, CASE WHEN LAG(flag, 1, ABS(flag - 1)) OVER (PARTITION BY id ORDER BY monthNum) = flag THEN 0 ELSE 1 END newValue
FROM
(
SELECT
id
, [month]
, MONTH(CAST('1 ' + [month] + ' 17' AS datetime)) monthNum
, flag
FROM @T
) Q
) Q2
) Q3