0

フィールド「周期性」に基づいて、フィールド「タイプ」でグループ化された値TrueをN行ごとに繰り返すクエリが必要です。私は例でよりよく説明できると思います:

次のテーブルを持つことで...

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」で定義された値)。

「タイプ」が 2 の行の場合、フィールド「execute_operation」は 2 行ごとに True としてマークされます。

どうすればこれを達成できますか?

4

3 に答える 3

2

ウィンドウ関数ROW_NUMBERモジュロ演算子と組み合わせることができます。

各グループの行番号シーケンス (1、2、3、...)。Modulo は、剰余を計算してシーケンス内の位置を返します。例:

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
;
于 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 に答える