2017-08-09 5 views
-1

私は、次の表があると仮定:id1id2によってグループ)Iが1にできるようにする必要SQLで異なるグループを選択していますか?

id1 id2 val 
------------- 
a x 123 
a x 456 

a y 123 
a y 456 

a z 123 
a z 456 
a z 789 

b x 123 
b x 456 

b y 123 

行および2)のみなどid1valに関しては異なるグループを選択:

grp_id id1 val 
---------------- 
1  a 123 
1  a 456 

2  a 123 
2  a 456 
2  a 789 

3  b 123 
3  b 456 

4  b 123 

EDIT:結果内のグループを識別するためにgrp_idを計算するには、DENSE_RANK()とサブクエリを使用することができます。

select DENSE_RANK() over(order by id1, id1) as grp_id, 
    id1, id2 
from tbl 
+1

grp_idはどこから来たのですか? –

+0

id1 = aとid2 = yの組み合わせのレコードが結果に表示されないのはなぜですか? –

+0

問題を解決するのに十分な情報を提供していないため、私はダウン投票しました。まともな回答が必要な場合は、grp_idをどう思いついたのかを指定する必要があります。 – SandPiper

答えて

0

私はあなたの希望ソリューションは、あなたが指定した元データを用いて達成可能であるか分かりません。

ここでそれを試みます。グループID番号を割り当てたCTEがあり、それをソーステーブルと結合してGROUP BYを実行します。

with 
group_ids as (
    select 
    id1, 
    id2, 
    row_number() over (order by id1, id2) as grp_id 
    from 
    tbl 
    group by 
    id1, 
    id2 
) 
select 
    group_ids.grp_id, 
    tbl.id1, 
    tbl.val 
from 
    tbl 
    inner join group_ids on 
    tbl.id1 = group_ids.id1 and 
    tbl.id2 = group_ids.id2 
group by 
    group_ids.grp_id, 
    tbl.id1, 
    tbl.val 

SQLフィドルはここにある:http://sqlfiddle.com/#!6/c2676/4/0

は、あなたの希望する結果と上記のコードを見直し、それが何らかの方法でマークを欠けている場合は私に知らせてください。

+0

ありがとうございます。 '' 'grp_id'''はDENSE_RANK()とOVER()で簡単に計算できますが、あなたの提案もうまくいくでしょう。結果については、目標は5ではなく4つのグループを取得することです。この例では、グループ1とグループ2は同じです。 – uncoder

関連する問題