2017-08-09 81 views
-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 

我需要能夠爲1)基團的行由id1id2和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 

任何想法?

編輯:爲了計算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

我不知道你想要的解決方案與您指定的源數據實現。

這是一個嘗試。有一個CTE分配一個組ID號,然後我們將它與源表加入並執行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

謝謝。使用DENSE_RANK()和OVER()可以更容易地計算''''grp_id''',但是你的建議也可以工作。至於結果,目標是得到4個組,而不是5.在你的例子中,組1和2是相同的。 – uncoder