SQL Group by внутри другой группы 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
----------------------------------------

Теперь я хочу найти для каждой временной метки, сколько (различных) членов каждого идентификатора находится в таблице, т.е. результат должен выглядеть так:


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

т.е. формат строки:

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

Я знаю, что вы можете решить эту проблему с помощью двух последовательных групповых операций (т.е. сначала по метке времени и идентификатору для подсчета членов и метке времени включения для конкатенации строк). Однако я надеюсь, что есть более разумное решение, так как я должен применить его к большому набору данных и не хочу выполнять 2 групповых запроса. Я работаю с Cloudera Impala, но я также приветствую решения на других языках SQL.

Спасибо за помощь.


person bublitz    schedule 19.11.2016    source источник


Ответы (1)


Вы можете сделать это, используя group by дважды и group_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;
person Gordon Linoff    schedule 19.11.2016
comment
Ссылка: cloudera.com/documentation/enterprise/5- 5-х / темы / - person Tim Biegeleisen; 19.11.2016