2016-11-25 21 views
0

"周期性"フィールドに基づいて、N行ごとにTrueを入力し、フィールド "Type"でグループ化したクエリを作成したいとします。 私は例を挙げてよりよく説明できると思う:別の列の値に基づいて新しい列に値を表示

...

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の行の場合、 "execute_operation"フィールドは2行ごとにTrueとマークされます。

どうすればこの問題を解決できますか?

答えて

2

ウィンドウ関数ROW_NUMBERmodulo演算子を組み合わせることができます。

行番号は各グループ(1,2,3、...)に順番に並べ替えられます。モジュロは、剰余を計算してシーケンス内の位置を返します。例:

1のMod 3 = 1

2のMod 3 = 2

3のMod 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 
; 
0

必要な結果を得るために以下のようにしました。 '%'(mod)ではなく、周期性を保つことができます。そして、私は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

をなくすのあなたは、以下のような何かを試す可能性があるので、私はそれを使用しているので、あなたのidカラムがsequentiall番号を持つことになりますと仮定している、適切な列名を持つ

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 
を交換してください
関連する問題