Google bigquery Bigquery-如何在连续日期范围内组合数据

Google bigquery Bigquery-如何在连续日期范围内组合数据,google-bigquery,Google Bigquery,我想结合同一产品的产品促销开始时间和结束时间,以及开始时间和结束时间范围内的时间。 例如: ID1的结束时间和ID2的开始时间是连续时间。 ID3的开始时间在ID2的开始和结束时间范围内。 因此,ID1 ID2 ID3应该组合在一起 身份证件 产品 开始时间 结束时间 1 一 2020-10-15 2020-10-20 2 一 2020-10-21 2020-10-24 三 一 2020-10-23 2020-10-25 4 一 2020-10-28 2020-10-29 5 b 2020-10

我想结合同一产品的产品促销开始时间和结束时间,以及开始时间和结束时间范围内的时间。 例如: ID1的结束时间和ID2的开始时间是连续时间。 ID3的开始时间在ID2的开始和结束时间范围内。 因此,ID1 ID2 ID3应该组合在一起

身份证件 产品 开始时间 结束时间 1 一 2020-10-15 2020-10-20 2 一 2020-10-21 2020-10-24 三 一 2020-10-23 2020-10-25 4 一 2020-10-28 2020-10-29 5 b 2020-10-29 2020-10-31 试试这个:

WITH test AS (
  SELECT 1 AS ID, 'a' AS Product, DATE '2020-10-15' AS Start_Time, DATE '2020-10-20' AS End_Time UNION ALL
  SELECT 2, 'a', DATE '2020-10-21', DATE '2020-10-24' UNION ALL
  SELECT 3, 'a', DATE '2020-10-23', DATE '2020-10-25' UNION ALL
  SELECT 4, 'a', DATE '2020-10-28', DATE '2020-10-29' UNION ALL
  SELECT 5, 'b', DATE '2020-10-29', DATE '2020-10-31'
)
SELECT Product, min(Start_Time), max(End_time), count(*)
FROM (
  SELECT *, countif(is_new_range) OVER (PARTITION BY Product ORDER BY Start_Time) AS range_id
  FROM (
    SELECT *, DATE_DIFF(Start_Time, MAX(End_time) OVER (PARTITION BY Product ORDER BY Start_Time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), DAY) > 2 AS is_new_range
    FROM test
  )
)
GROUP BY Product, range_id
试试这个:

WITH test AS (
  SELECT 1 AS ID, 'a' AS Product, DATE '2020-10-15' AS Start_Time, DATE '2020-10-20' AS End_Time UNION ALL
  SELECT 2, 'a', DATE '2020-10-21', DATE '2020-10-24' UNION ALL
  SELECT 3, 'a', DATE '2020-10-23', DATE '2020-10-25' UNION ALL
  SELECT 4, 'a', DATE '2020-10-28', DATE '2020-10-29' UNION ALL
  SELECT 5, 'b', DATE '2020-10-29', DATE '2020-10-31'
)
SELECT Product, min(Start_Time), max(End_time), count(*)
FROM (
  SELECT *, countif(is_new_range) OVER (PARTITION BY Product ORDER BY Start_Time) AS range_id
  FROM (
    SELECT *, DATE_DIFF(Start_Time, MAX(End_time) OVER (PARTITION BY Product ORDER BY Start_Time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), DAY) > 2 AS is_new_range
    FROM test
  )
)
GROUP BY Product, range_id

考虑以下内容

select min(id) id,
    product,
    min(start_time) start_time,
    max(end_time) end_time,
    count(1) Combine_Count
from (
  select *, 
    countif(ifnull(isNew, true)) over win grp
  from (
    select *, 
      start_time > lag(end_time) over win + 1 isNew
    from `project.dataset.table`
    window win as (partition by product order by start_time)
  )
  window win as (partition by product order by start_time)
) t
group by product, grp    
当应用于问题中的样本数据时-输出为

考虑以下内容

select min(id) id,
    product,
    min(start_time) start_time,
    max(end_time) end_time,
    count(1) Combine_Count
from (
  select *, 
    countif(ifnull(isNew, true)) over win grp
  from (
    select *, 
      start_time > lag(end_time) over win + 1 isNew
    from `project.dataset.table`
    window win as (partition by product order by start_time)
  )
  window win as (partition by product order by start_time)
) t
group by product, grp    
当应用于问题中的样本数据时-输出为


考虑接受答案!显然,你更喜欢的答案是:o)(如果还没有,请投票赞成)考虑接受答案!显然,你更喜欢的那一个:o)(如果还没有投票,请投赞成票)