2017-03-06 12 views
-1

次の行の値を確認して結果でグループを取得しようとしています。次の行の値に基づいてOracleグループ

サンプルデータ

Table A 

COL1 COL2 COL3 
---- ---- ---- 
B BUY  1 
B SELL 1.2 
B SELL 2 
C BUY  3 
C SELL 4 
C BUY  5 

結果

COL1 COL2 COUNT(1) 
---- ---- -------- 
B BUY   1 
B SELL  2 
C BUY   1 
C SELL  1 
C BUY   1 

答えて

0

COL3で注文したようです。これが当てはまる場合:

SELECT col1, 
     col2, 
     change - COALESCE(LAG(change) OVER (PARTITION BY col1 ORDER BY change), 0) 
     AS cnt 
FROM (
    SELECT col1, 
     col2, 
     CASE LEAD(col2) OVER (PARTITION BY col1 ORDER BY col3) 
      WHEN col2 
      THEN NULL 
      ELSE ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col3) 
     END AS change 
    FROM a 
) 
WHERE change IS NOT NULL; 
0

私が正しく理解していれば、あなたは行番号のアプローチの違いでこれを行うことができます。

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

これは隣接するグループのグループは、col3の順序に基づく値である。

+0

上記のクエリで行の順序が失われていますが、結果の順序が保持される方法はありますか? –

+0

@HarshMehtaとあなたのデータセットの行の順序をどのように決定するのですか?オーダーは、オーダーなしでは保証されていないため、サンプルデータで何を注文しますか? @HarshMehta。 – xQbert

+0

。 。私はあなたが何を意味するのか分かりません。これはあなたが望むものを得るための最も簡単な方法のようです。 –

関連する問題