2016-11-15 3 views
0

У меня следующая таблица в Vertica DB:инкапсулированной Группировки или условная агрегация в Vertica DB

+---------+-------+ 
| Readout | Event | 
+---------+-------+ 
|  1 | A  | 
|  1 | B  | 
|  1 | A  | 
|  2 | B  | 
|  2 | A  | 
+---------+-------+ 

Я хотел бы группу каждый отсчета и подсчитать частоту событий, в результате чего в виде таблицы, как это :

+---------+----------------+----------------+-----------------+ 
| Readout | Count(Readout) | Count(Event A) | Count (Event B) | 
+---------+----------------+----------------+-----------------+ 
|  1 |    3 |    2 |    1 | 
|  2 |    2 |    1 |    1 | 
+---------+----------------+----------------+-----------------+ 

Я уверен, что есть простой GROUP BY команда, но я не могу обернуть мою голову вокруг него.

ответ

4

Вы хотите условную агрегацию:

select readout, count(*), 
     sum(case when event = 'A' then 1 else 0 end) as num_a, 
     sum(case when event = 'B' then 1 else 0 end) as num_b 
from t 
group by readout; 
+0

Эпос, работает как шарм, спасибо большое! Последующие вопросы: Должен ли я указывать имена событий? Что делать, если я хочу сделать это для всех имен событий в таблице, для случая, если у меня нет списка всех возможных событий, которые находятся в таблице. – valenzio

+0

@valenzio. , , Если у вас нет списка событий, вам может понадобиться динамический SQL. Я не думаю, что Vertica даже поддерживает 'crosstab()'. –

+0

Я запускаю команды в python, поэтому я могу сделать первый querry, если бы я получил список событий (DISTINCT). И чем использовать цикл for для создания запроса, который вы предложили. – valenzio