根据另一列值在新列中显示一个值period123y
问题描述:
我想根据字段“Periodicity”进行查询,每隔N行重复True值,按字段“Type”分组。 我想我可以解释用一个例子更好:根据另一列值在新列中显示一个值period123y
通过具有邻桌...
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
...我想有一个查询,将返回这样的事情...
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行(在“periodicity”字段中定义的值)标记为True。
对于“type”为2的行,字段“execute_operation”每2行标记为True。
我该如何做到这一点?
答
您可以将窗口函数ROW_NUMBER与modulo运算符组合。行编号序列每组(1,2,3,...)。 Modulo通过计算余数来返回序列中的位置。例如:
1模3 = 1。
2模3 = 2
3模3 = 0。
当行数超过周期性国防部是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
;
答
我已经做了如下所示的取得所需的结果而不是'%'(国防部),你可以保持周期性。而我假设你的id列将有sequentiall号码,我已经使用它,因为消除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