根据另一个列值在新列中定期显示值

时间:2016-11-25 12:34:57

标签: sql-server periodicity

我希望有一个基于字段“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。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以将窗口函数ROW_NUMBERmodulo运算符结合使用。

每个组的行号序列(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