Как подсчитать строки, сгруппированные по атрибуту, если этот атрибут не появился до определенной даты? - PullRequest
1 голос
/ 26 марта 2019

Предположим, таблица заказов

CREATE TABLE Orders (
order_id int(11),
customer_id int(11),
purchase_date datetime
)

Нам нужен следующий отчет: Для клиентов, которые не разместили заказ до этого месяца, сколько заказов было размещено на клиента?

Здесьочень медленный sql, который я сейчас использую:

SELECT count(order_id) num_of_orders, customer_id 
FROM   (SELECT order_id, customer_id
        FROM   orders 
        WHERE  customer_id NOT IN (SELECT DISTINCT customer_id 
                                   FROM   orders 
                                   WHERE  purchase_date < '2019-03-01')) a 
GROUP  BY customer_id;

Есть ли более быстрый / более эффективный способ написания этого запроса?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Я бы переписал это как:

SELECT COUNT(order_id), customer_id
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM orders o1 WHERE o1.customer_id = o.customer_id AND o1.purchase_date < '2019-03-01')
GROUP BY customer_id;

Это ускорит вашу производительность благодаря индексу заказов (customer_id).

Однако, если таблица orders содержит null для customer_id, то подзапрос NOT IN вернет null.

1 голос
/ 26 марта 2019

Я не уверен, что это будет быстрее, но это проще:

SELECT customer_id, count(*) as num_of_orders
FROM  orders o
GROUP BY customer_id
HAVING MIN(purchase_date) >= '2019-03-01';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...