0

我想要一个基于字段“周期性”的查询,每 N 行重复一次值 True,按字段“类型”分组。我想我可以用一个例子更好地解释:

通过让下一张桌子......

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 行标记为 True(字段“periodicity”中定义的值)。

对于“type”为 2 的行,每 2 行将归档的“execute_operation”标记为 True。

我怎样才能做到这一点?

4

3 回答 3

2

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

行号对每组进行排序(1、2、3、...)。模通过计算余数返回序列中的位置。例子:

1 模 3 = 1。

2 模 3 = 2。

3 模 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
;
于 2016-11-25T12:54:44.657 回答
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 
于 2016-11-25T13:04:05.687 回答
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
于 2016-11-25T13:13:45.677 回答