PostgreSQL Query для группировки значений столбцов в столбцы - PullRequest
0 голосов
/ 30 октября 2018

У меня есть таблица PostreSQL, показанная ниже. ordered - логический столбец, а created_at - отметка времени. Я пытаюсь получить строки, которые сообщают мне общее количество успешных заказов (count(t)) против невыполненных заказов (count(f)), а также общее количество заказов (t + f), сгруппированных по дням (извлечено из * 1005). *)

ordered | created_at t | 2018-10-10 20:13:10 t | 2018-10-10 21:23:11 t | 2018-10-11 06:33:52 f | 2018-10-11 13:13:33 f | 2018-10-11 19:17:11 f | 2018-10-12 00:53:01 f | 2018-10-12 05:14:41 f | 2018-10-12 16:33:09 f | 2018-10-13 17:14:14

Я хочу следующий результат

created_at | ordered_true | ordered_false | total_orders 2018-10-10 | 2 | 0 | 2 2018-10-11 | 1 | 2 | 3 2018-10-12 | 0 | 3 | 3 2018-10-13 | 0 | 1 | 1

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Попробуйте:

SELECT created_at, 
       COUNT(ordered) filter (where ordered = 't') AS ordered_true,
       COUNT(ordered) filter (where ordered = 'f') AS ordered_false, 
       COUNT(*) AS total_orders 
FROM my_table
GROUP BY created_at

РЕДАКТИРОВАТЬ: использование ответа @ klint, как указано в комментариях к группировке OP по create_at, приведет к нежелательным результатам, так как один день будет иметь пару групп (временная метка дольше, чем просто день)

0 голосов
/ 30 октября 2018

Используйте агрегатные функции sum() и count():

select 
    created_at::date, 
    sum(ordered::int) as ordered_true,
    sum((not ordered)::int) as ordered_false,
    count(*) as total_orders
from my_table
group by 1
order by 1

 created_at | ordered_true | ordered_false | total_orders 
------------+--------------+---------------+--------------
 2018-10-10 |            2 |             0 |            2
 2018-10-11 |            1 |             2 |            3
 2018-10-12 |            0 |             3 |            3
 2018-10-13 |            0 |             1 |            1
(4 rows)
...