根据另一个列值定期在新列中显示一个值
Showing a value periodicaly in a new column, based on another column value
我想要一个基于字段 "Periodicity" 的查询,每 N 行重复值 True,按字段 "Type" 分组。
我想我可以用一个例子更好地解释:
通过下一个 table...
id type periodicity
1 1 3
2 1 3
3 1 3
4 1 3
5 1 3
6 1 3
7 1 3
8 1 3
9 1 3
10 2 2
11 2 2
12 2 2
13 2 2
14 2 2
15 2 2
16 2 2
...我想要一个 return 类似这样的查询...
id type periodicity execute_operation
1 1 3 TRUE
2 1 3 FALSE
3 1 3 FALSE
4 1 3 TRUE
5 1 3 FALSE
6 1 3 FALSE
7 1 3 TRUE
8 1 3 FALSE
9 1 3 FALSE
10 2 2 TRUE
11 2 2 FALSE
12 2 2 TRUE
13 2 2 FALSE
14 2 2 TRUE
15 2 2 FALSE
16 2 2 TRUE
对于字段"type"为1的行,字段"execute_operation"将每隔3行标记为True(字段"periodicity"中定义的值)。
对于 "type" 为 2 的行,字段 "execute_operation" 将每 2 行标记为 True。
我怎样才能做到这一点?
您可以组合窗口函数 ROW_NUMBER with the modulo 运算符。
每组按行号排序(1、2、3、...)。 Modulo returns序列内的位置通过计算余数。示例:
1 Mod 3 = 1.
2 Mod 3 = 2.
3 Mod 3 = 0.
当行号超过周期性的mod为1时返回true
WITH [Sample] AS
(
-- CTE provides sample data.
SELECT
*
FROM
(
VALUES
(1, 1, 3),
(2, 1, 3),
(3, 1, 3),
(4, 1, 3),
(5, 1, 3),
(6, 1, 3),
(7, 1, 3),
(8, 1, 3),
(9, 1, 3),
(10, 2, 2),
(11, 2, 2),
(12, 2, 2),
(13, 2, 2),
(14, 2, 2),
(15, 2, 2),
(16, 2, 2)
) AS x(id, [type], periodicity)
)
SELECT
s.id,
s.[type],
s.periodicity,
CASE ROW_NUMBER() OVER (PARTITION BY s.[type] ORDER BY s.id) % periodicity
WHEN 1 THEN 1
ELSE 0
END AS execute_operation
FROM
[Sample] AS s
ORDER BY
s.id
;
我已经像下面那样做了以获得所需的结果而不是'%'(mod)你可以保持周期性。而且我假设您的 id 列将具有顺序号,所以我使用它是因为消除了 row_number
SELECT ID,
TYPE,
CASE
WHEN RNO = 1
AND TYPE = 1 THEN 'TRUE'
WHEN RNO = 2
AND TYPE = 2 THEN 'TRUE'
ELSE 'FALSE'
END STATUS
FROM (SELECT ID,
TYPE,
CASE
WHEN TYPE = 1 THEN Replace(ID%3, 0, 3)
ELSE Replace(ID%2, 0, 2)
END RNO
FROM #TABLE1)A
您可以尝试如下所示,请替换为适当的列名,
update tbl_Sample set Operation = 0 --default to false
;WITH CTE
AS
(
select *
,ROW_NUMBER() over(Partition by Periodicity order by ID) 'R'
from tbl_Sample
)
UPDATE CTE
SET Operation = 1
WHERE R%Periodicity = 1
我想要一个基于字段 "Periodicity" 的查询,每 N 行重复值 True,按字段 "Type" 分组。 我想我可以用一个例子更好地解释:
通过下一个 table...
id type periodicity
1 1 3
2 1 3
3 1 3
4 1 3
5 1 3
6 1 3
7 1 3
8 1 3
9 1 3
10 2 2
11 2 2
12 2 2
13 2 2
14 2 2
15 2 2
16 2 2
...我想要一个 return 类似这样的查询...
id type periodicity execute_operation
1 1 3 TRUE
2 1 3 FALSE
3 1 3 FALSE
4 1 3 TRUE
5 1 3 FALSE
6 1 3 FALSE
7 1 3 TRUE
8 1 3 FALSE
9 1 3 FALSE
10 2 2 TRUE
11 2 2 FALSE
12 2 2 TRUE
13 2 2 FALSE
14 2 2 TRUE
15 2 2 FALSE
16 2 2 TRUE
对于字段"type"为1的行,字段"execute_operation"将每隔3行标记为True(字段"periodicity"中定义的值)。
对于 "type" 为 2 的行,字段 "execute_operation" 将每 2 行标记为 True。
我怎样才能做到这一点?
您可以组合窗口函数 ROW_NUMBER with the modulo 运算符。
每组按行号排序(1、2、3、...)。 Modulo returns序列内的位置通过计算余数。示例:
1 Mod 3 = 1.
2 Mod 3 = 2.
3 Mod 3 = 0.
当行号超过周期性的mod为1时返回true
WITH [Sample] AS
(
-- CTE provides sample data.
SELECT
*
FROM
(
VALUES
(1, 1, 3),
(2, 1, 3),
(3, 1, 3),
(4, 1, 3),
(5, 1, 3),
(6, 1, 3),
(7, 1, 3),
(8, 1, 3),
(9, 1, 3),
(10, 2, 2),
(11, 2, 2),
(12, 2, 2),
(13, 2, 2),
(14, 2, 2),
(15, 2, 2),
(16, 2, 2)
) AS x(id, [type], periodicity)
)
SELECT
s.id,
s.[type],
s.periodicity,
CASE ROW_NUMBER() OVER (PARTITION BY s.[type] ORDER BY s.id) % periodicity
WHEN 1 THEN 1
ELSE 0
END AS execute_operation
FROM
[Sample] AS s
ORDER BY
s.id
;
我已经像下面那样做了以获得所需的结果而不是'%'(mod)你可以保持周期性。而且我假设您的 id 列将具有顺序号,所以我使用它是因为消除了 row_number
SELECT ID,
TYPE,
CASE
WHEN RNO = 1
AND TYPE = 1 THEN 'TRUE'
WHEN RNO = 2
AND TYPE = 2 THEN 'TRUE'
ELSE 'FALSE'
END STATUS
FROM (SELECT ID,
TYPE,
CASE
WHEN TYPE = 1 THEN Replace(ID%3, 0, 3)
ELSE Replace(ID%2, 0, 2)
END RNO
FROM #TABLE1)A
您可以尝试如下所示,请替换为适当的列名,
update tbl_Sample set Operation = 0 --default to false
;WITH CTE
AS
(
select *
,ROW_NUMBER() over(Partition by Periodicity order by ID) 'R'
from tbl_Sample
)
UPDATE CTE
SET Operation = 1
WHERE R%Periodicity = 1