SQL 中重叠日期行之间的汇总时间线
Aggregate timeline between overlapping date rows in SQL
我们正在创建一个数据集来查看客户对公司产品的使用情况,如果不同产品的使用情况存在重叠,则创建一个时间范围来显示整个期间,该时间范围显示任何产品的使用情况。产品使用结束与新开始购买之间的差距在哪里,即显示为不同的旅程。下面的示例源数据
客户级别所需的输出:
规则:1) 由于客户1001在P10结束日期之前开始使用P11产品,因此应该是一个连续的旅程,开始日期应该在第1行,结束日期应该在第2行。
- 第 2 行和第 3 行的结束日期之间存在差距,即客户 1001 使用任何产品,这必须显示为单独的旅程
基本上是在每个连续获取时间段的客户级别创建聚合
我们如何使用普通 SQL 来实现这一点。任何指针都会非常有帮助。
这是 Teradata 标准扩展的简单任务 SQL:NORMALIZE。
with cte as
(
select NORMALIZE -- combine overlapping periods
customer_id
,period(start_date, end_date) as pd
from mytable
)
select
customer_id
,trim(customer_id) || '-'
|| trim(row_number() over (partition by customer_id order by pd)
,begin(pd) -- split the period
,end(pd) -- back into individual columns
from cte
由于 NORMALIZE 仅适用于句点,因此您需要使用 period(start_date, end_date)
创建一个句点。期间包括开始,但不包括结束,如果您的逻辑不同,您可能需要切换到 period(start_date, end_date+1)
和 last(pd)
而不是 end(pd)
。
我们正在创建一个数据集来查看客户对公司产品的使用情况,如果不同产品的使用情况存在重叠,则创建一个时间范围来显示整个期间,该时间范围显示任何产品的使用情况。产品使用结束与新开始购买之间的差距在哪里,即显示为不同的旅程。下面的示例源数据
客户级别所需的输出:
规则:1) 由于客户1001在P10结束日期之前开始使用P11产品,因此应该是一个连续的旅程,开始日期应该在第1行,结束日期应该在第2行。
- 第 2 行和第 3 行的结束日期之间存在差距,即客户 1001 使用任何产品,这必须显示为单独的旅程 基本上是在每个连续获取时间段的客户级别创建聚合
我们如何使用普通 SQL 来实现这一点。任何指针都会非常有帮助。
这是 Teradata 标准扩展的简单任务 SQL:NORMALIZE。
with cte as
(
select NORMALIZE -- combine overlapping periods
customer_id
,period(start_date, end_date) as pd
from mytable
)
select
customer_id
,trim(customer_id) || '-'
|| trim(row_number() over (partition by customer_id order by pd)
,begin(pd) -- split the period
,end(pd) -- back into individual columns
from cte
由于 NORMALIZE 仅适用于句点,因此您需要使用 period(start_date, end_date)
创建一个句点。期间包括开始,但不包括结束,如果您的逻辑不同,您可能需要切换到 period(start_date, end_date+1)
和 last(pd)
而不是 end(pd)
。