我有超过 30 天的记录。 我想对 30 天内的此类记录进行分组。 例子:9月10日输入的订单,30天内的所有记录都属于这个订单开始日期。接下来超过 30 天属于另一个组,但我们需要再次应用相同的逻辑。
ORD_ID ORD_DT
O1 9/10/2022
O1 9/25/2022
O1 9/29/2022
O1 10/15/2022
O1 10/30/2022
O1 11/10/2022
O1 11/18/2022
O1 11/29/2022
O1 12/20/2022
我的预期输出是:
ORD_ID ORD_START_DT ORD_DT
O1 9/10/2022 9/10/2022
O1 9/10/2022 9/25/2022
O1 9/10/2022 9/29/2022
O1 10/15/2022 10/15/2022
O1 10/15/2022 10/30/2022
O1 10/15/2022 11/10/2022
O1 11/18/2022 11/18/2022
O1 11/18/2022 11/29/2022
O1 11/18/2022 12/20/2022
这里是输入数据的SQL
WITH Order_Detail AS
(
SELECT 'O1' AS ORD_ID , DATE('2022-09-10') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-09-25') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-09-29') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-10-15') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-10-30') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-11-10') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-11-18') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-11-29') AS ORD_DT
UNION ALL
SELECT 'O1' AS ORD_ID , DATE('2022-12-20') AS ORD_DT
)
SELECT ORD_ID, ORD_DT
FROM ORDER_DETAIL
当递归查询派上用场时,这是一个用例。
假设你的数据按订单id分区,按订单日期排序:
with recursive
data as (
select o.*,
row_number() over(partition by ord_id order by ord_dt) rn
from order_details o
),
rcte as (
select ord_id, ord_dt, rn, ord_dt as start_dt from data where rn = 1
union all
select d.ord_id, d.ord_dt, d.rn,
case when d.ord_dt > date_add(r.start_dt, interval 30 day) then d.ord_dt else r.start_dt end
from rcte r
inner join data d on d.ord_id = r.ord_id and d.rn = r.rn + 1
)
select * from rcte order by ord_id, ord_dt
第一个CTE枚举每个订单的行数;然后,递归 CTE 从每个订单的第一条记录开始迭代,并在每一行上应用日期逻辑。
first_value(ord_dt) over (partition by ord_id order by ord_dt asc) as ord_start_dt
会给你订单 ID 出现在表格中的第一个日期。