下圖為一張訂單表(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