sql 查詢至少連續n天下單的使用者
阿新 • • 發佈:2020-08-20
下圖為一張訂單表(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