如何识别在 7 天内下了 3 个及以上订单的客户。 SQL/holistic/redshift
How to identify customer who make order for 3 and more orders in 7 days. SQL/holistic/redshift
总结:我想获取7天内拥有3个及更多 orderid的客户列表。如果客户满足每个日期的条件,则该客户可能会出现多次。
Table 姓名:T1
客户编号
订单号
创建于
A1B3
vds34rve4-3f
2021 年 1 月 1 日
AA2B
hvdhkc767-s3d
2021 年 1 月 1 日
EA986
bckd33rfvfbvdf
2021 年 1 月 1 日
A1B3
jdbjkvshb3rdec
2021 年 1 月 1 日
SFK3
bhabsd-bbc83ccs
2021 年 2 月 1 日
AA2B
hcbadcbsbc7cd
2021 年 3 月 1 日
A1B3
hjjac73an83-3fc
2021 年 7 月 1 日
DEH32
gdyafjk-24vfd
2021 年 7 月 1 日
A1B3
jkhbdj434jcbjke
2021 年 7 月 1 日
AA2B
jkkcbjq90ksnc
2021 年 8 月 1 日
AA2B
cjbugd3ahsddka
2021 年 8 月 1 日
A1B3
kbcq7w69ufj4t4
2021 年 9 月 1 日
SFK3
bcdubi7wklcna8
2021 年 9 月 1 日
EA986
cbyatea4jwndns
2021 年 9 月 1 日
A1B3
biqbdepaljkcl9
2021 年 9 月 1 日
AA2B
nuqya8wownd2ln2
2021 年 9 月 1 日
A1B3
ndkuq2uowmdlqn
2021 年 9 月 1 日
预期输出:
客户编号
开始日期
结束日期
count_orderid
A1B3
2021 年 1 月 1 日
2021 年 7 月 1 日
4
Aa2B
2021 年 3 月 1 日
2021 年 9 月 1 日
4
A1B3
2021 年 7 月 1 日
2021 年 9 月 1 日
5
我目前的解决方案是
WITH daily_count_order AS (
SELECT customerid,
DATE_TRUNC('day', createdat) AS startdate,
DATE_TRUNC('day', DATEADD(DAY, 6, createdat)) AS enddate,
COUNT(orderid) AS count_order,
ROW_NUMBER() OVER (PARTITION BY customerid ORDER BY linkdate ASC) AS rows
FROM T1
GROUP BY userid, startdate, enddate
)
我不知道将有关条件的逻辑(7 天内 3 个和更多 orderid 转换为 sql 查询。
您可以为此使用 lead()
。 . .但要数清楚就更难了。从满足此条件的日期开始:
select t.*
from (select t.*,
lead(createdat, 2) over (partition by customerid order by createdat) as date_2
from t
) t
where date_2 < createdat + interval '7 day';
如果您确实需要计数,那么一种方法是自连接:
select t.customerid, t.createdat, count(*)
from t join
t t2
on t2.customerid = t.customerid and
t2.createdat >= t.createdat and
t2.createdat < t.createdat + interval '7 day'
group by t.customerid, t.createdat
having count(*) >= 3;
总结:我想获取7天内拥有3个及更多 orderid的客户列表。如果客户满足每个日期的条件,则该客户可能会出现多次。
Table 姓名:T1
客户编号 | 订单号 | 创建于 |
---|---|---|
A1B3 | vds34rve4-3f | 2021 年 1 月 1 日 |
AA2B | hvdhkc767-s3d | 2021 年 1 月 1 日 |
EA986 | bckd33rfvfbvdf | 2021 年 1 月 1 日 |
A1B3 | jdbjkvshb3rdec | 2021 年 1 月 1 日 |
SFK3 | bhabsd-bbc83ccs | 2021 年 2 月 1 日 |
AA2B | hcbadcbsbc7cd | 2021 年 3 月 1 日 |
A1B3 | hjjac73an83-3fc | 2021 年 7 月 1 日 |
DEH32 | gdyafjk-24vfd | 2021 年 7 月 1 日 |
A1B3 | jkhbdj434jcbjke | 2021 年 7 月 1 日 |
AA2B | jkkcbjq90ksnc | 2021 年 8 月 1 日 |
AA2B | cjbugd3ahsddka | 2021 年 8 月 1 日 |
A1B3 | kbcq7w69ufj4t4 | 2021 年 9 月 1 日 |
SFK3 | bcdubi7wklcna8 | 2021 年 9 月 1 日 |
EA986 | cbyatea4jwndns | 2021 年 9 月 1 日 |
A1B3 | biqbdepaljkcl9 | 2021 年 9 月 1 日 |
AA2B | nuqya8wownd2ln2 | 2021 年 9 月 1 日 |
A1B3 | ndkuq2uowmdlqn | 2021 年 9 月 1 日 |
预期输出:
客户编号 | 开始日期 | 结束日期 | count_orderid |
---|---|---|---|
A1B3 | 2021 年 1 月 1 日 | 2021 年 7 月 1 日 | 4 |
Aa2B | 2021 年 3 月 1 日 | 2021 年 9 月 1 日 | 4 |
A1B3 | 2021 年 7 月 1 日 | 2021 年 9 月 1 日 | 5 |
我目前的解决方案是
WITH daily_count_order AS (
SELECT customerid,
DATE_TRUNC('day', createdat) AS startdate,
DATE_TRUNC('day', DATEADD(DAY, 6, createdat)) AS enddate,
COUNT(orderid) AS count_order,
ROW_NUMBER() OVER (PARTITION BY customerid ORDER BY linkdate ASC) AS rows
FROM T1
GROUP BY userid, startdate, enddate
)
我不知道将有关条件的逻辑(7 天内 3 个和更多 orderid 转换为 sql 查询。
您可以为此使用 lead()
。 . .但要数清楚就更难了。从满足此条件的日期开始:
select t.*
from (select t.*,
lead(createdat, 2) over (partition by customerid order by createdat) as date_2
from t
) t
where date_2 < createdat + interval '7 day';
如果您确实需要计数,那么一种方法是自连接:
select t.customerid, t.createdat, count(*)
from t join
t t2
on t2.customerid = t.customerid and
t2.createdat >= t.createdat and
t2.createdat < t.createdat + interval '7 day'
group by t.customerid, t.createdat
having count(*) >= 3;