2016-11-06 11 views
4

考えるテーブル/データを数える:取得キュー繰り返し同じ値がこのような

WITH T(col1, col2) AS(
    SELECT 1, 'A' FROM DUAL 
    UNION ALL 
    SELECT 2, 'B' FROM DUAL 
    UNION ALL 
    SELECT 3, 'B' FROM DUAL 
    UNION ALL 
    SELECT 4, 'B' FROM DUAL 
    UNION ALL 
    SELECT 5, 'A' FROM DUAL 
    UNION ALL 
    SELECT 6, 'B' FROM DUAL 
    UNION ALL 
    SELECT 7, 'B' FROM DUAL 
    UNION ALL 
    SELECT 8, 'A' FROM DUAL 
) 

私は行がcol1

によって注文された場合 col2に同じ値を繰り返し回数、平均値、 col2キュー繰り返しカウントを取得する必要があります

結果がでなければなりません:

col1 | col2 | queue_count 
------------------------- 
1 |A  |1 
2 |B  |3 
3 |B  |3 
4 |B  |3 
5 |A  |1 
6 |B  |2 
7 |B  |2 
8 |A  |1 

私はいくつかの分析関数を試みたが、望ましい結果を達成しません。

"純粋な" SQLでこれを行うことは可能ですか? pl/sqlを使用せずに(ルーピングなしで各行のステップ処理など)

答えて

2

これはギャップと島の問題です。これを解決する1つの方法は次のとおりです。

select col1, col2, 
     count(*) over (partition by col2, seqnum - seqnum_col2) as queue_count 
from (select t.*, 
      row_number() over (partition by col2 order by col1) as seqnum_col2, 
      row_number() over (order by col1) as seqnum 
     from t 
    ) t; 

これがなぜ機能するのか説明するのは少し難しいです。しかし、副問合せを実行して結果を見ると、行番号の違いが同じ値を持つ隣接する行を識別するために働く理由が「取得」されます。col2

+0

ありがとうございます。 – RIKI

2

ファクタリングされたサブクエリでテスト用の入力データを投稿していただき、ありがとうございます。

あなたはあなたのオラクルバージョンについて言及していません(異なるバージョンでは異なる解決法が可能ですので、すべての質問に含める必要があります)。いずれにしても、Oracle 12以降を使用している場合は、MATCH_RECOGNIZEを使用する非常に簡単で効率的なソリューションがあります。

WITH T (col1, col2) AS (
     SELECT 1, 'A' FROM DUAL UNION ALL 
     SELECT 2, 'B' FROM DUAL UNION ALL 
     SELECT 3, 'B' FROM DUAL UNION ALL 
     SELECT 4, 'B' FROM DUAL UNION ALL 
     SELECT 5, 'A' FROM DUAL UNION ALL 
     SELECT 6, 'B' FROM DUAL UNION ALL 
     SELECT 7, 'B' FROM DUAL UNION ALL 
     SELECT 8, 'A' FROM DUAL 
    ) 
select col1, col2, queue_count 
from t 
match_recognize (
    order by col1 
    measures final count(*) as queue_count 
    all rows per match 
    pattern (A+ | B+) 
    define A as A.col2 = 'A', 
      B as B.col2 = 'B' 
) 
; 

COL1 COL2 QUEUE_COUNT 
----- ---- ------------ 
    1 A    1 
    2 B    3 
    3 B    3 
    4 B    3 
    5 A    1 
    6 B    2 
    7 B    2 
    8 A    1 

8 rows selected 
関連する問題