Повторяющиеся значения при запросе с generate_series и оставленном соединении? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь подсчитать данные из разных таблиц в определенные даты, но по какой-то причине я получаю неправильный результат, он просто дублирует счет из другой таблицы.

Если вы посмотрите, то вВ таблице «Предметы» только 1 запись.Но при подсчете через count () я получаю 5.

Можете ли вы объяснить и помочь мне решить эту проблему?

Данные:

create table views(id bigint, created_at timestamp);
create table items(id bigint, created_at timestamp);

insert into views(id, created_at) values
('1', '2018-12-28 22:46:35'),
('2', '2018-12-28 22:46:35'),
('3', '2018-12-28 22:46:35'),
('4', '2018-12-28 22:46:35'),
('5', '2018-12-28 22:46:35');

insert into items(id, created_at) values
('1', '2018-12-28 22:46:35');

Запрос:

select 
dates.d as day,
count(v.*) as views_count,
count(i.*) as items_count

from (
    select d from generate_series('2018-12-01'::date, '2018-12-30', '1 day' ) as d
) as dates

left join views as v on v.created_at::date = dates.d
left join items as i on i.created_at::date = dates.d

group by day order by day desc;

DbFiddle.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

потому что ваша views таблица.у вас есть внутренний выбор, который возвращается каждый день 2012/12.затем вы выполняете левое соединение с таблицей views, в которой есть 5 записей о том, что все они находятся в день 2012/12/28.так что на этот день у вас 5 записей.

0 голосов
/ 28 декабря 2018

Поместите агрегаты в подзапросы, например:

select 
    dates.d as day,
    coalesce(v.count, 0) as views_count,
    coalesce(i.count, 0) as items_count
from generate_series('2018-12-26'::date, '2018-12-30', '1 day' ) as dates(d)
left join (
    select created_at::date as day, count(*)
    from views 
    group by day
    ) as v on v.day = dates.d
left join (
    select created_at::date as day, count(*)
    from items 
    group by day
    ) as i on i.day = dates.d
order by day desc

          day           | views_count | items_count 
------------------------+-------------+-------------
 2018-12-30 00:00:00+01 |           0 |           0
 2018-12-29 00:00:00+01 |           0 |           0
 2018-12-28 00:00:00+01 |           5 |           1
 2018-12-27 00:00:00+01 |           0 |           0
 2018-12-26 00:00:00+01 |           0 |           0
(5 rows)    
0 голосов
/ 28 декабря 2018

count(<expression>) подсчитывает количество строк, где <expression> не равно NULL.

Я думаю, что вы хотите посчитать количество различных значений.Если это так:

select dates.d as day,
       count(distinct v.id) as views_count,
       count(distinct i.id) as items_count

Вы также можете использовать v.* и i.* в качестве аргумента, но id должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...