Как подсчитать количество первых заказов клиентов? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть этот запрос, который необходимо исправить.Так что сейчас у меня есть 90% того, что мне нужно, но этот последний шаг доставляет мне проблемы.Я знаю, что в 1996-07-04 сотрудник № 5 впервые посетил мой сайт и по праву получил счет первого таймера равным 1. В 1996-07-11 я знаю, что сотрудник № 5 снова посетил сайт, но мы не хотимпосчитай его снова.

SELECT 
    Orders.OrderDate,
    COUNT(OrderDetails.OrderDetailID) AS NumSessions, 
    COUNT(DISTINCT Orders.EmployeeID)
FROM OrderDetails
LEFT JOIN Orders
ON OrderDetails.OrderID=Orders.OrderID
GROUP BY Orders.OrderDate    



EXPECTED:
DATE    NumSessions FirstTimers
1996-07-04  3   1
1996-07-11  3   0

ACTUAL:
DATE    NumSessions FirstTimers
1996-07-04  3   1
1996-07-11  3   1

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Это немного сложно.Один из способов - использовать подзапрос для вычисления даты первого заказа и использовать ее в логике:

SELECT o.OrderDate,
       COUNT(od.OrderDetailID) AS NumSessions, 
       SUM( o.OrderDate = oe.FirstOrderDate ) as FirstTimers
FROM Orders o LEFT JOIN
     OrderDetails od
     ON O.OrderId = od.OrderId LEFT JOIN
     (SELECT o.EmloyeeID, MIN(OrderDate) as FirstOrderDate
      FROM Orders o 
      GROUP BY OrderDate
     ) o
     ON oe.EmployeeId = o.EmployeeId
GROUP BY o.OrderDate  
0 голосов
/ 15 февраля 2019

Может быть, что-то вроде этого (хотя я не могу гарантировать, что это синтаксически правильно):

SELECT 
    Orders.OrderDate,
    COUNT(OrderDetails.OrderDetailID) AS NumSessions,
    COUNT(DISTINCT Orders.EmployeeID WHERE Orders.OrderDate = (
        SELECT MIN(b.OrderDate) FROM Orders b WHERE Orders.EmployeeID = b.EmployeeID)
    )
FROM OrderDetails
LEFT JOIN Orders
ON OrderDetails.OrderID=Orders.OrderID
GROUP BY Orders.OrderDate

Но я не знаю, как это повлияло бы на производительность.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...