Нахождение первого заказа за один год

#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 . Исправил это.