You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在BigQuery中合并多条记录为单条记录的问题排查

BigQuery合并连续同金额的时间区间记录

输入表

pdtamountstart_dtend_dt
a0.52022-01-052022-01-07
a2.22022-01-082022-01-08
a0.52022-01-092022-01-10
a0.52022-01-112022-01-14
b1.52022-01-152022-01-18
b1.52022-01-192022-01-19
b1.52022-01-252022-01-28

期望输出表

pdtamountstart_dtend_dt
a0.52022-01-052022-01-07
a2.22022-01-082022-01-08
a0.52022-01-092022-01-14
b1.52022-01-152022-01-19
b1.52022-01-252022-01-28

当前尝试的SQL语句

SELECT pdt, amount, MIN(start_dt) start_dt, MAX(end_dt) end_dt FROM (
  SELECT *, dt - COUNT(1) OVER (PARTITION BY pdt ORDER BY start_dt) AS part
    FROM table, UNNEST (GENERATE_ARRAY(
      UNIX_DATE(start_dt), UNIX_DATE(end_dt))
    ) AS dt
) GROUP BY pdt, amount, part

实际输出表

pdtamountstart_dtend_dt
a0.52022-01-052022-01-14
a2.22022-01-082022-01-08
b1.52022-01-152022-01-19
b1.52022-01-252022-01-28

问题分析

原SQL仅按pdt分区生成分组标识,未结合amount的变化逻辑,导致同一pdt下所有同amount的记录被强制合并,忽略了中间不同amount的间隔(比如商品a的0.5记录被2.2记录隔开,本应分为两组,却被合并成了一组)。

修正后的SQL语句

WITH ordered_data AS (
  SELECT 
    pdt, 
    amount, 
    start_dt, 
    end_dt,
    -- 按商品和金额分组,按开始时间排序,获取上一条同组记录的结束日期
    LAG(end_dt) OVER (PARTITION BY pdt, amount ORDER BY start_dt) AS prev_end_dt
  FROM `your_table_name` -- 替换为实际表名
),
grouped_data AS (
  SELECT
    *,
    -- 当前记录与上一条同组记录时间不连续时,标记为新组,累加生成分组ID
    SUM(CASE WHEN start_dt = DATE_ADD(prev_end_dt, INTERVAL 1 DAY) THEN 0 ELSE 1 END) 
      OVER (PARTITION BY pdt, amount ORDER BY start_dt) AS group_id
  FROM ordered_data
)
SELECT
  pdt,
  amount,
  MIN(start_dt) AS start_dt,
  MAX(end_dt) AS end_dt
FROM grouped_data
GROUP BY pdt, amount, group_id
ORDER BY pdt, start_dt;

说明

  1. ordered_data:按pdt和amount双维度分区,对记录按start_dt排序,通过LAG函数获取同商品同金额的上一条记录的结束日期。
  2. grouped_data:判断当前记录的start_dt是否与上一条同组记录的end_dt连续(即次日),不连续则标记为新组,通过累加生成唯一的group_id。
  3. 最后按pdt、amount和group_id聚合,取每组的最小开始日期和最大结束日期,得到期望的合并结果。

内容的提问来源于stack exchange,提问作者KMH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:50:27