Google bigquery 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-29 2020-10-31 试试这个: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
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)(如果还没有投票,请投赞成票)