2016-11-25 184 views
0

我想根据字段“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。

我该如何做到这一点?

回答

2

您可以将窗口函数ROW_NUMBERmodulo运算符组合。行编号序列每组(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 
; 
0

我已经做了如下所示的取得所需的结果而不是'%'(国防部),你可以保持周期性。而我假设你的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 
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 
相关问题