2016-11-25 216 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 
相關問題