如何在 Big Query 中对 30 天内的记录进行分组

问题描述 投票:0回答:2

我有超过 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
sql google-bigquery recursive-query date-arithmetic
2个回答
0
投票

当递归查询派上用场时,这是一个用例。

假设你的数据按订单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 从每个订单的第一条记录开始迭代,并在每一行上应用日期逻辑。


0
投票

first_value(ord_dt) over (partition by ord_id order by ord_dt asc) as ord_start_dt
会给你订单 ID 出现在表格中的第一个日期。

© www.soinside.com 2019 - 2024. All rights reserved.