Digamos que eu tenha uma tabela de compras parecida com esta:
Purchases
---------
Item_ID
Purchase_Date
Customer_ID
Como eu conseguiria obter o conjunto de compras, a partir da primeira compra, para cada cliente que esteja pelo menos X dias após a última compra? Por exemplo, se tivermos os dados abaixo e x=10:
Item_ID PurchaseDate Customer_ID
123 07/29/23 1000
123 08/04/23 1000
123 08/16/23 1000
563 07/03/23 7785
563 07/05/23 7785
788 08/17/23 2489
A consulta deve retornar:
Item_ID PurchaseDate Customer_ID
123 07/29/23 1000
123 08/11/23 1000
563 07/03/23 7785
788 08/17/23 2489
Então, para o cliente 1000, a primeira compra conta, porque é uma nova compra. A segunda compra ocorre há menos de 10 dias da última compra, por isso é descartada. A terceira compra deste cliente conta porque é superior ou igual a 10 dias após a última compra. Para o cliente 7785, apenas a primeira conta porque a segunda compra ocorre menos de 10 dias após a última compra e, finalmente, para o cliente 2489, ele tem apenas uma nova compra, então conta apenas como a nova compra. )
Eu estava pensando em usar a função lag
SELECT
t.Item_ID,
t.PurchaseDate,
t.Customer_ID
FROM (
SELECT
p.Item_ID,
p.PurchaseDate,
p.Customer_ID,
LAG OVER(PARTITION BY Customer_ID ORDER BY PurchaseDate) next_purchase
ROW_NUMBER() OVER(PARTITION BY Customer_ID ORDER BY PurchaseDate) rownum
FROM
PurchaseTable p
) t
WHERE
DATEDIFF(DAY, t.PurchaseDate, t.next) >= 10) or rownum=1
EDIT: Desculpas, a descrição estava incorreta. Mudei a pergunta e o exemplo para os detalhes corretos.
Peguei seu código e o aperfeiçoei um pouco - de acordo com sua descrição, ele fornece os resultados solicitados:
A maior diferença no seu código é que o LAG fornece um valor negativo (ele verifica a linha anterior e subtrai a data posterior de uma data anterior - portanto, valor negativo. Portanto, declarei @threshold como -10 (dias) e mostrando tudo o que está diferença -10 dias ou mais (ou seja, -11, -12, ...). Também comentei deliberadamente o rownum = 1, porque isso é redundante para shopping_difference IS NULL (será nulo para cada primeiro (ou apenas) linha no grupo - portanto, qualifica a linha a ser mostrada).