2016-11-19 37 views
2

我目前有一個問題,我需要找到一組內的組數。但是,我想爲包含組創建聯機,並在一個字符串內連接較小的組。SQL Group由另一個組內的

下表顯示了我目前所面臨的形勢:

---------------------------------------- 
Timestamp   ID    Member 
---------------------------------------- 
1     1    A 
1     1    B 
1     2    A 
1     2    B 
1     2    C 
2     1    A 
2     2    A 
2     2    A 
2     2    C 
---------------------------------------- 

現在我要找到每個時間戳,每個ID的許多(不同)的成員是如何在表中,即,結果應是這樣的:


Timestamp   MemberIDCount 
---------------------------------------- 
1     1:2,2:3 
2     1:1,2:2 
---------------------------------------- 

即字符串的格式是:

[ID]:[count(distinct(member)],... 

我知道,你可以用兩個連續的group bys來解決這個問題(也就是說,首先在時間戳和ID上計數成員,在字符串連接上打開時間戳)。但是,我希望有一個更智能的解決方案,因爲我必須將它應用於大型數據集,並且不希望執行2組bys。我與Cloudera Impala一起工作,但其他SQL語言的解決方案也受到讚賞。

謝謝你的幫助。

回答

2

您可以使用兩次group bygroup_concat()。我沒有黑斑羚在手,但這樣的事情應該工作:

select timestamp, 
     group_concat(concat_ws(':', member, cnt)) 
from (select timestamp, member, count(*) as cnt 
     from t 
     group by timestamp, member 
    ) tm 
group by timestamp 
order by timestamp; 
+0

參考:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_group_concat.html –