#mysql #sql
Вопрос:
Я пытаюсь определить, сколько новых людей сделали заказ в 2018 году. Это выглядит достаточно прямолинейно, но есть ошибка с размещением вычисляемых полей в операторе WHERE.
SELECT DISTINCT COUNT(c.customer_id)
FROM Customer c
LEFT JOIN
Orders o ON c.customer_id=o.customer_id
WHERE MIN(order_date) > '2017-12-31'
AND MIN(order_date) < '2019-01-01';
Комментарии:
1. @jarlh, Это не скажет вам, является ли это их первым заказом
2. @Barмар, я просто пишу шаг 2…
3. «Поиск первого порядка…» Как это связано с постлогией «Звездных войн»?
4. Почему вы хотите подсчитать, когда все, что вы делаете, — это находите первый заказ клиента в течение определенного периода?
Ответ №1:
Вы можете добиться этого, указав порядковый номер заказов, а затем выбрав первую строку для каждого клиента. Хотя я не совсем понимаю, почему вы выполняете подсчет заказов, когда вы просто хотите рассмотреть первые заказы. Тем не менее, нижеприведенное должно работать просто отлично.
SELECT count(res.customer_id) FROM (
SELECT c.customer_id,
ROW_NUMBER() OVER (PARTITION BY c.customer_id ORDER BY o.order_date ASC) row_num
FROM Customer c
LEFT JOIN Orders o ON c.customer_id=o.customer_id
WHERE o.order_date > '2017-12-31'
AND o.order_date < '2019-01-01'
) res WHERE res.row_num=1
Ответ №2:
Присоединяйтесь с помощью подзапроса, который находит клиентов, которые были новыми в 2018 году.
SELECT COUNT(DISTINCT o.customer_id)
FROM Orders o
JOIN (
SELECT DISTINCT customer_id
FROM Orders
GROUP BY customer_id
HAVING MIN(order_date) > '2017-12-31'
) o1 ON o1.customer_id = o.customer_id
WHERE o.order_date < '2019-01-01';
Также нет необходимости присоединяться Customers
, так как идентификатор клиента Orders
указан .
И правильный способ получить отчетливое количество-это COUNT(DISTINCT o.customer_id)
не DISTINCT COUNT(o.customer_id)
так .
Комментарии:
1. Теперь я понимаю, почему мне не нужно было бы присоединяться к ним сейчас и как правильно считать, но ваш запрос выдает мне ошибку.
2. Я забыл
GROUP BY
в подзапросе.3. Это не изменило ошибку
4. В чем заключается ошибка?
5. Извините, я оставил
ON
пункт, который пришел из-за присоединенияCustomers
. Исправил это.