Допустим, есть таблица, в которой есть столбцы с именами binary_value
, name
и created_at
вместе со столбцом id
.
Вот скрипка SQL для этого вопроса: http://sqlfiddle.com/#! 15 / d15d1 / 36
Каким был бы эффективный запрос для получения результата, подобного следующему?
ones_count | zeros_count | total
3 | 1 | 4
Пока что я получил:
with cte2(count_type, counted) as (
with cte as (
select binary_value,
sum(case when binary_value = 1 then 1 else 0 end) as ones_count,
sum(case when binary_value = 0 then 1 else 0 end) as zeros_count
from infos
where name = 'me'
and created_at >= '2020-03-10 21:13:01.319677'
and created_at <= '2020-03-10 21:13:01.619677'
group by binary_value
)
select 'ones_count', ones_count from cte where binary_value = 1
union
select 'ones_count', zeros_count from cte where binary_value = 0
union
select 'total', sum(ones_count + zeros_count) as total from cte
)
select * from cte2;
Что дает его в виде столбца:
count_type | counted
ones_count | 1
total | 4
ones_count | 3
Как мы можем получить результат подряд? Может быть, есть другой подход, чем общее выражение таблицы? Я начинаю смотреть на кросс-таблицу, которая является postgres -specifi c, и поэтому задаюсь вопросом, не является ли все это излишним.
Включая также DDL и данные здесь:
create table infos (
id serial primary key,
name character varying not null,
binary_value integer not null,
created_at timestamp without time zone not null
)
insert into infos ("binary_value", "name", "created_at") values
(1, 'me', '2020-03-10 21:13:01.319677'),
(1, 'me', '2020-03-10 21:13:01.419677'),
(0, 'me', '2020-03-10 21:13:01.519677'),
(1, 'me', '2020-03-10 21:13:01.619677');