如何用SQL统计客户首单后1小时内的总下单数量
需求说明
获取每位客户在首单生成后1小时内的累计下单数量,要求无需先计算首单时间再关联原表,可一步完成计算。
表结构说明
订单表字段如下:
DateTime:订单下单时间CustomerId:客户ID- 其余字段不参与本次计算
实现方案
可以通过窗口函数在单次订单表扫描中完成计算,不需要额外做子查询和原表的关联操作,性能优于先计算首单时间再join回原表的实现方式,符合一步完成的需求。
纯单层查询写法(所有主流数据库兼容)
无需嵌套子查询,一层查询直接完成统计:
SELECT CustomerId, SUM( CASE -- 筛选首单后1小时内的订单,包含首单本身;如需排除首单可加 AND DateTime > MIN(DateTime) OVER (PARTITION BY CustomerId) WHEN DateTime <= MIN(DateTime) OVER (PARTITION BY CustomerId) + INTERVAL 1 HOUR THEN 1 ELSE 0 END ) AS order_cnt_in_1h_after_first FROM orders GROUP BY CustomerId
简化写法(适配支持QUALIFY语法的数据库,如BigQuery、Spark SQL、Snowflake)
代码更简洁可读性更高:
SELECT CustomerId, COUNT(*) AS order_cnt_in_1h_after_first FROM orders QUALIFY DateTime <= MIN(DateTime) OVER (PARTITION BY CustomerId) + INTERVAL 1 HOUR GROUP BY CustomerId
语法适配说明
不同数据库的时间间隔计算语法存在差异,可根据使用的数据库做对应调整:
- MySQL:
DATE_ADD(first_order_dt, INTERVAL 1 HOUR) - PostgreSQL:
first_order_dt + INTERVAL '1 hour' - SQL Server:
DATEADD(HOUR, 1, first_order_dt)
内容的提问来源于stack exchange,提问作者Bovard
相关产品推荐
相关产品推荐

