Предполагая, что у вас всегда есть хотя бы одна запись в таблице для каждого из последних 7 дней (независимо от company_id
), вы можете использовать условное агрегирование следующим образом:
select
date(timestamp) as day,
count(distinct case when company_id = 1 then hash end) as visitors,
sum(company_id = 1) as pageviews
from behaviour
where timestamp >= curdate() - interval 7 day
group by day
Примечание что я изменил ваш запрос, чтобы использовать стандартную арифметику даты, которая, как мне кажется, легче понять, что функции даты.
В противном случае вам нужно было бы переместить условие даты из предложения where
в агрегатные функции:
select
date(timestamp) as day,
count(distinct case when timestamp >= curdate() - interval 7 day and company_id = 1 then hash end) as visitors,
sum(timestamp >= curdate() - interval 7 day and company_id = 1) as pageviews
from behaviour
group by day
Если ваша таблица большая, это может быть дорого, поэтому я бы не советовал.
Кроме того, вы можете сгенерировать производную таблицу дат и left join
с оригиналом запрос:
select
curdate - interval x.n day day,
count(distinct b.hash) visitors,
count(b.hash) page_views
from (
select 1 n union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7
) x
left join behavior b
on b.company_id = 1
and b.timestamp >= curdate() - interval x.n day
and b.timestamp < curdate() - interval (x.n - 1) day
group by x.n