Вычислить отличное значение_1, когда значение_2, значение_3 равно определенному значению - PullRequest
0 голосов
/ 19 февраля 2020

Таблица вывода выглядит следующим образом, скажем:

table : people
+-------+-----------+-----------+
|   id  |  label    |   action  |
+-------+-----------+-----------+
|   1   |  aaaaa    |       B   |
|   1   |  aaaaa    |       B   |
|   1   |  aaaaa    |       A   |
|   2   |  aaaaa    |       B   |
|   2   |  aaaaa    |       B   |
+-------+-----------+-----------+

Что я хотел бы сделать, это подсчитать уникальные идентификаторы следующим образом:

table : people
+-------+-----------+-------------+-------------+
|   id  |  label    |   action_A  |   action_B  |
+-------+-----------+-------------+-------------+
|   1   |  aaaaa    |       1     |       1     |
|   2   |  aaaaa    |       0     |       1     |
+-------+-----------+-------------+-------------+

Ответы [ 3 ]

3 голосов
/ 20 февраля 2020

Просто используйте условное агрегирование:

SELECT id, label, 
   coalesce(max(1) filter (WHERE action = 'A'), 0) action_a,
   coalesce(max(1) filter (WHERE action = 'B'), 0) action_b
FROM ...
GROUP BY 1, 2
1 голос
/ 19 февраля 2020

Вы можете сделать условное агрегирование:

select id, label, 
       count(distinct case when action = 'A' then action end) as action_a,
       count(distinct case when action = 'B' then action end) as action_b
from t
group by id, label;

ИЛИ Вы можете просто использовать max():

select id, label, 
       max(case when action = 'A' then 1 else 0 end) as action_a,
       max(case when action = 'B' then 1 else 0 end) as action_b
from t
group by id, label;
1 голос
/ 19 февраля 2020

Просто используйте условное агрегирование:

select id, label,
       sum(case when label = 'A' then 1 else 0 end) as a,
       sum(case when label = 'B' then 1 else 0 end) as b
from t
group by id, label;
...