我希望有一个基于字段“Periodicity”的查询,将每N行重复一次值True,按字段“Type”分组。 我想我可以通过一个例子更好地解释:
通过下一张桌子......
$q.all(this.uploadFiles, this.uploadTables)
...我希望有一个返回类似的查询......
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
对于字段“type”为1的行,字段“execute_operation”将每隔3行标记为True(在“周期性”字段中定义的值)。
对于“type”为2的行,每两行都会将“execute_operation”字段标记为True。
我怎样才能做到这一点?
答案 0 :(得分:2)
您可以将窗口函数ROW_NUMBER与modulo运算符结合使用。
每个组的行号序列(1,2,3,...)。 Modulo通过计算余数返回序列中的位置。例如:
1 Mod 3 = 1。
2 Mod 3 = 2。
3 Mod 3 = 0。
当行号的周期的mod为1时,则返回true。
private Test(){};
public Test getInstance(){
if(Test._instance == null){
_instance = new Test();
}
return Test._instance;
}
答案 1 :(得分:0)
我做了如下所示以达到所需的结果而不是'%'(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
答案 2 :(得分:0)
您可以尝试以下内容,请使用相应的列名替换
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