1. 程式人生 > 實用技巧 >sql 查詢至少連續n天下單的使用者

sql 查詢至少連續n天下單的使用者

下圖為一張訂單表(order1),現希望查找出至少連續3天下單的使用者。

第一步:將訂單表按UserId分組根據日期Date排序

第二步:用日期Date減去對應的排序號Num,若日期是連續的,則相減的結果Datedif相等。

第三步:按UserId,Datedif分組計數,得到各使用者的連續下單天數。

第四步:篩選連續下單天數≥n的使用者

# 訂單表  order1
# UserId  Date  Orders
# step1: 將訂單表按UserId分組根據日期Date排序
 SELECT UserId,`Date`,orders,
 row_number() over(PARTITION BY UserId ORDER BY DATE)Num
 FROM order1
 # step2: 用日期Date減去對應的排序號Num,若日期是連續的,則相減的結果Datedif相等。
 SELECT UserId,`Date`,`Date`-Num  AS DateDif
 FROM 
 (
 SELECT UserId,`Date`,orders,
 row_number() over(PARTITION BY UserId ORDER BY DATE)Num
 FROM order1
 )a
 # step3:按UserId,Datedif分組計數,得到各使用者的連續下單天數。
 SELECT UserId,COUNT(1) AS Consecutive
 FROM (
  SELECT UserId,`Date`,`Date`-Num  AS DateDif
 FROM 
 (
 SELECT UserId,`Date`,orders,
 row_number() over(PARTITION BY UserId ORDER BY DATE)Num
 FROM order1
 )a
 )b
 GROUP BY UserId,DateDif
 # 篩選連續下單天數≥3的使用者
 SELECT Userid
 FROM
 (
 SELECT UserId,COUNT(1) AS Consecutive
 FROM (
 SELECT UserId,`Date`,`Date`-Num  AS DateDif
 FROM 
 (
 SELECT UserId,`Date`,orders,
 row_number() over(PARTITION BY UserId ORDER BY DATE)Num
 FROM order1
 )a
 )b
 GROUP BY UserId,DateDif
 )c
 WHERE Consecutive>=3