google-bigquery - Bigquery - 如何组合连续日期范围内的数据
问题描述
我想将同一产品的产品促销开始时间和结束时间以及开始时间和结束时间范围内的时间结合起来。例如:ID1 的结束时间和ID2 的开始时间是一个继续时间。ID3的开始时间在ID2的开始和结束时间范围内。因此,ID1 ID2 ID3 应该组合在一起。
ID | 产品 | 开始时间 | 时间结束 |
---|---|---|---|
1 | 一个 | 2020-10-15 | 2020-10-20 |
2 | 一个 | 2020-10-21 | 2020-10-24 |
3 | 一个 | 2020-10-23 | 2020-10-25 |
4 | 一个 | 2020-10-28 | 2020-10-29 |
5 | b | 2020-10-29 | 2020-10-31 |
预期的
ID | 产品 | 开始时间 | 时间结束 | 合并计数 |
---|---|---|---|---|
1 | 一个 | 2020-10-15 | 2020-10-25 | 3 |
4 | 一个 | 2020-10-28 | 2020-10-29 | 1 |
5 | b | 2020-10-29 | 2020-10-31 | 1 |
你有什么建议吗?
解决方案
考虑下面
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
当应用于您问题中的样本数据时 - 输出是
推荐阅读
- installation - Ubuntu 20.4 Asus Tuf Dash F15 无法安装 Nvidia 驱动程序
- javascript - 使用 javascript 的 Android Webview 输入
- php - 如何解决这两个表之间的内连接问题?
- vue.js - 用于使用没有计算属性的 getter/setter 的自定义 vue 指令(如 v-model)
- typescript - 限制打字稿类型定义
- python - Pyspark 在从字符串转换为时间戳时处理多种日期时间格式
- typescript - Typescript 无法通过 optional-boolean 推断函数属性的参数类型
- java - 递归遍历嵌套列表
- c# - 如何在使用 Shell 调用页面时覆盖 ViewModel
- .htaccess - 通过 htaccess 重写 URL 模式