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

BigQuery中能否合并并拆分重叠的区间数组?

在BigQuery中实现重叠区间的合并与拆分

完全可以在BigQuery中实现该需求,以下是具体的实现方案:

核心思路

  1. 提取所有关键日期:将两张表的StartDate和EndDate全部收集起来,按ID分组后排序,这些日期就是拆分区间的边界点。
  2. 生成连续子区间:通过窗口函数将相邻的日期配对,形成一个个不重叠的子区间。
  3. 判断区间类型:对每个子区间,检查它是否被苹果区间覆盖、香蕉区间覆盖,从而标记为A(仅苹果)、B(仅香蕉)或AB(两者都有)。
  4. 过滤无效区间:剔除起始日期大于等于结束日期的无效区间。

示例实现代码

假设苹果表名为apple_table,香蕉表名为banana_table,执行以下SQL:

WITH all_dates AS (
    -- 收集所有ID对应的关键日期
    SELECT ID, PARSE_DATE('%d/%m/%y', StartDate) AS date FROM apple_table
    UNION ALL
    SELECT ID, PARSE_DATE('%d/%m/%y', EndDate) AS date FROM apple_table
    UNION ALL
    SELECT ID, PARSE_DATE('%d/%m/%y', StartDate) AS date FROM banana_table
    UNION ALL
    SELECT ID, PARSE_DATE('%d/%m/%y', EndDate) AS date FROM banana_table
),
sorted_dates AS (
    -- 按ID和日期排序,生成相邻日期对
    SELECT 
        ID,
        date AS start_date,
        LEAD(date) OVER (PARTITION BY ID ORDER BY date) AS end_date
    FROM all_dates
),
valid_intervals AS (
    -- 过滤无效区间
    SELECT ID, start_date, end_date
    FROM sorted_dates
    WHERE end_date IS NOT NULL AND start_date < end_date
),
interval_types AS (
    -- 判断每个区间的类型
    SELECT
        vi.ID,
        vi.start_date,
        vi.end_date,
        CONCAT(
            IF(EXISTS(
                SELECT 1 FROM apple_table a
                WHERE a.ID = vi.ID
                AND PARSE_DATE('%d/%m/%y', a.StartDate) <= vi.start_date
                AND PARSE_DATE('%d/%m/%y', a.EndDate) >= vi.end_date
            ), 'A', ''),
            IF(EXISTS(
                SELECT 1 FROM banana_table b
                WHERE b.ID = vi.ID
                AND PARSE_DATE('%d/%m/%y', b.StartDate) <= vi.start_date
                AND PARSE_DATE('%d/%m/%y', b.EndDate) >= vi.end_date
            ), 'B', '')
        ) AS type
    FROM valid_intervals vi
)
-- 输出最终结果,格式化日期为原格式
SELECT
    ID,
    FORMAT_DATE('%d/%m/%y', start_date) AS StartDate,
    FORMAT_DATE('%d/%m/%y', end_date) AS EndDate,
    type
FROM interval_types
ORDER BY ID, start_date;

输入示例

苹果食用区间表

IDStartDateEndDate
101/01/1901/04/19
201/01/1903/01/19

香蕉食用区间表

IDStartDateEndDate
115/12/1812/01/19
101/02/1917/02/19
115/03/1915/04/19
201/06/1901/07/19

输出结果

IDStartDateEndDatetype
115/12/1801/01/19B
101/01/1912/01/19AB
112/01/1901/02/19A
101/02/1917/02/19AB
117/02/1915/03/19A
115/03/1901/04/19AB
101/04/1915/04/19B
201/01/1903/01/19A
201/06/1901/07/19B

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:30:25