select A.CustID, ElapsedDays = datediff(d, A.InvoiceDate, B.InvoiceDate)
from Orders A
inner join Orders B on B.CustID = A.CustID
and B.ProdID = 312
-- more than 6 months ago
and B.InvoiceDate > dateadd(m,6,A.InvoiceDate)
where A.ProdID = 105
Приведенный выше запрос является простой интерпретацией вашего требования, когда ЛЮБАЯ покупка A (105) и D (312) происходила с интервалом в 6 месяцев. Если клиент приобрел
- А в январе
- А в марте
- А в июле, а затем приобрел
- D в сентябре
для клиента будет возвращено 2 строки (январь и март), поскольку за ними следует покупка D более чем через 6 месяцев.
Следующий запрос вместо этого находит все случаи, когда ПОСЛЕДНЯЯ покупка совершается за 6 месяцев или более до покупки FIRST D.
select A.CustID, ElapsedDays = datediff(d, A.InvoiceDate, B.InvoiceDate)
from (
select CustID, Max(InvoiceDate) InvoiceDate
from Orders
where ProdID = 105
group by CustID) A
inner join (
select CustID, Min(InvoiceDate) InvoiceDate
from Orders
where ProdID = 312
group by CustID) B on B.CustID = A.CustID
-- more than 6 months ago
and B.InvoiceDate > dateadd(m,6,A.InvoiceDate)
И если для того же сценария, описанного выше, вы не хотите видеть этого клиента, потому что покупки A (Jul) и D (Sep) не разделены на 6 месяцев, вы можете исключить их из первого запроса, используя EXISTS
фильтр.
select A.CustID, ElapsedDays = datediff(d, A.InvoiceDate, B.InvoiceDate)
from Orders A
inner join Orders B on B.CustID = A.CustID
and B.ProdID = 312
-- more than 6 months ago
and B.InvoiceDate > dateadd(m,6,A.InvoiceDate)
where A.ProdID = 105
AND NOT EXISTS (
SELECT *
FROM Orders C
WHERE C.CustID=A.CustID
AND C.InvoiceDate > A.InvoiceDate
and C.InvoiceDate < B.InvoiceDate
and C.ProdID in (105,312))