0

私はこの SQLフィドルを持っています

sequence_number フィールドで並べ替える場合、これらのレコードをグループ化し、次のロジックに基づいて row_number を指定する必要があります。次の行タイプが 0 ではないすべてのレコードは、同じグループの一部です。

例、提供された SQL フィドルから、

シーケンス番号 0、1、および 2 は同じグループの一部であり、シーケンス番号 3 および 4 は別のグループの一部です。基本的に、行タイプが 0 までの行は、単一のグループの一部です。返そうとするデータは次のようになります。

GROUP    LINE_TYPE    SEQUENCE_NUMBER    PRODUCT
------------------------------------------------
1        0            0                  REM322
1        6            1                  Discount
1        7            2                  Loyalty Discount
2        0            3                  RGM32
2        6            4                  Discount

私が求めていることを言い換える別の方法は、シーケンス番号で並べ替えると、グループ番号が 0 になるとグループ番号が変わるということです。

パーティション/ラグ、さらには自己結合を使用してこれを行う方法を考えようとして頭を悩ませてきましたが、問題が発生しています。

どんな助けでも感謝します。

4

2 に答える 2

1

line_type が 0 の場合は、列の値を 1 に設定し、これに対して実行中の合計を (分析関数として SUM を使用して) 計算します。

select sum(case when line_type  = 0 then 1 
                else 0 end
          ) over (order by sequence_number) as grp,
       line_type,
       sequence_number,
       product
from ret_trand
order by sequence_number;

デモ

于 2013-11-15T04:09:11.470 に答える
0

グループ化を行う別の方法は、階層クエリと を使用することCONNECT_BY_ROOTです。

SELECT CONNECT_BY_ROOT sequence_number AS first_in_sequence,
       line_type,
       sequence_number,
       product
FROM   ret_trand
START WITH
       line_type = 0
CONNECT BY
       (    sequence_number - 1 = PRIOR sequence_number
        AND line_type <> 0)
ORDER SIBLINGS BY
       sequence_number;

SQLFIDDLE

これにより、グループの最初のシーケンス番号によってグループが識別されます。

これをグループの順次ランキングに変更したい場合は、次のように使用できますDENSE_RANK

WITH first_in_sequences AS
(
  SELECT CONNECT_BY_ROOT sequence_number AS first_in_sequence,
         line_type,
         sequence_number,
         product
  FROM   ret_trand
  START WITH
         line_type = 0
  CONNECT BY
         (    sequence_number - 1 = PRIOR sequence_number
          AND line_type <> 0)
  ORDER SIBLINGS BY
         sequence_number
)
SELECT DENSE_RANK() OVER ( ORDER BY first_in_sequence ) AS "group",
       line_type,
       sequence_number,
       product
FROM   first_in_sequences;

SQLFIDDLE

于 2013-11-15T08:57:03.907 に答える