2016-11-19 7 views
2

現在、私はグループ内のグループの数を見つける必要がある問題があります。しかし、私は包括的なグループのためにオンラインで作成し、文字列内の小さなグループを連結したいと思います。別のグループ内のSQLグループby

---------------------------------------- 
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)],... 

私はあなたが2つの連続したグループバイス(すなわち、最初にタイムスタンプとIDをカウントするメンバーとストリング連結のオンタイムスタンプ)でこれを解決できることを知っています。しかし、私はそれを大規模なデータセットに適用する必要があり、2つのグループバイズを実行したくないので、よりスマートなソリューションがあることを願っています。私は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 –