PostgreSQL объединяет результат COUNT и GROUP BY - PullRequest
0 голосов
/ 23 мая 2018
select type, created_at::date , count(type)
from txns
group by created_at::date, type
order by created_at::date;

Приведенный выше SQL-запрос дает следующий вывод:

  type   | created_at | count 
---------+------------+-------
 full    | 2017-05-20 |     2
 virtual | 2017-05-20 |     2
 full    | 2017-05-21 |     1
 virtual | 2017-05-21 |     1
 full    | 2017-05-22 |     3

Как сгруппировать приведенный выше результат по created_at, чтобы получить следующий вывод:

 created_at | full_count | virtual_count
------------+-----------------
 2017-05-20 |     2     |  2
 2017-05-21 |     1     |  1
 2017-05-22 |     3     |  0

Я хочу получить число типов full и virtual на created_at в одной строке.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Если у вас есть более двух типов, и при дальнейшей обработке вы можете иметь дело с hstore:

WITH q AS ( SELECT type, created_at::date , count(type) FROM txns GROUP BY 1,2)
SELECT created_at, hstore(array_agg(type), array_agg(count::text))
FROM q GROUP BY 1;
0 голосов
/ 23 мая 2018

Я бы сделал это без CTE / подзапроса, как:

select created_at::date,
       sum( (type = 'Full')::int ) as cnt_full,
       sum( (type = 'Virtual')::int ) as cnt_virtual
from txns
group by created_at::date
order by created_at::date;

Postgres часто материализует CTE, так что это может даже иметь небольшое преимущество в производительности.

Примечание. Вы также можете использовать filter в более поздних версиях Postgres:

select created_at::date,
       count(*) filter (where type = 'Full') as cnt_full,
       count(*) filter (where type = 'Virtual') as cnt_Virtual
from txns
group by created_at::date
order by created_at::date;
0 голосов
/ 23 мая 2018

это должно работать:

with so as (
select type, created_at::date , count(type) from txns group by created_at::date, type order by created_at::date
)
 select
  created_at
, sum(case when type = 'full' then count else 0 end) full_count
, sum(case when type = 'virtual' then count else 0 end) virtual_count
from so
group by created_at;

 created_at | full_count | virtual_count
------------+------------+---------------
 2017-05-20 |          2 |             2
 2017-05-21 |          1 |             1
 2017-05-22 |          3 |             0
(3 rows)
...