#postgresql
Вопрос:
у меня есть такой запрос:
select count(distinct(buyer)) from tablename
where date(purchase_date) >= (cast(current_date as date) - interval '220' day)
На выходе получается: 11449
тогда у меня есть этот запрос:
with cte as (SELECT
distinct(buyer),
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '1' day))as day1 ,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '2' day))as day2 ,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '5' day))as day5 ,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '7' day))as day7 ,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '15' day))as day15,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '30' day))as day30,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '60' day))as day60,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '90' day))as day90,
COUNT(order) FILTER (WHERE date(purchase_date) >= (cast(current_date as date) - interval '220' day))as day220
FROM tablename
group by buyer
order by day220 desc)
select count(distinct(buyer)) from cte
и результат таков 20507
Я ожидал, что количество будет одинаковым в обоих запросах, поскольку я выполняю их в одной и той же таблице в один и тот же момент.
Что я здесь упускаю? Я ошибаюсь, ожидая, что подсчеты будут одинаковыми?
Комментарии:
1. Несвязанный, но:
distinct
не является функцией. Заключение имени столбца послеdistinct
ключевого слова в круглые скобки ничего не дает.
Ответ №1:
Во втором нет основного предложения WHERE, поэтому оно включает отдельных покупателей из всех строк таблицы. Вы, кажется, думаете, что PostgreSQL собирается объединить все предложения ФИЛЬТРА (ГДЕ…) и применить их в качестве основного предложения WHERE, но он этого не делает (и было бы неразумно для него это делать).
Кроме того, order
без двойных кавычек не является законным названием столбца, как order
и зарезервированное слово. Вы должны публиковать примеры запросов, которые действительно могут быть выполнены.
Комментарии:
1. его order_id, подумал, что это не повлияет на понимание моего вопроса