基于客户ID统计两日期区间内的订单数量问题
按Customer_ID统计指定日期区间内的订单数量解决方案
核心思路
先从TableA中提取每个客户的最近两条记录的日期区间(上一条记录日期为起始,最后一条记录日期为结束),再关联TableB统计该区间内的订单数量。
分步实现SQL
1. 提取每个客户的目标日期区间
使用窗口函数ROW_NUMBER()对每个客户的记录按日期倒序排序,筛选出最新记录;再用LAG()函数获取该客户上一条记录的日期,形成统计区间:
WITH customer_date_intervals AS ( SELECT customer_id, -- 获取上一条记录的日期作为区间起始 LAG(record_date) OVER (PARTITION BY customer_id ORDER BY record_date) AS interval_start, -- 最新记录的日期作为区间结束 record_date AS interval_end FROM ( SELECT customer_id, record_date, -- 按客户分组,日期倒序排名,rn=1为最新记录 ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY record_date DESC) AS record_rank FROM TableA ) ranked_records WHERE record_rank = 1 -- 仅保留每个客户的最新记录 )
2. 关联TableB统计区间内订单数
将上述日期区间结果与TableB关联,筛选订单日期落在区间内的数据,按客户分组统计数量:
SELECT cdi.customer_id, COUNT(b.order_id) AS interval_order_count FROM customer_date_intervals cdi LEFT JOIN TableB b ON cdi.customer_id = b.customer_id -- 筛选订单日期在目标区间内的记录 AND b.order_date BETWEEN cdi.interval_start AND cdi.interval_end GROUP BY cdi.customer_id;
针对示例的说明
对于customer_id=13,上述SQL会自动提取其区间为2022-11-17 05:36:19至2022-11-21 06:22:08,并统计TableB中该区间内的订单数(示例中返回3)。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

