SQL 中重叠日期行之间的汇总时间线

Aggregate timeline between overlapping date rows in SQL

我们正在创建一个数据集来查看客户对公司产品的使用情况,如果不同产品的使用情况存在重叠,则创建一个时间范围来显示整个期间,该时间范围显示任何产品的使用情况。产品使用结束与新开始购买之间的差距在哪里,即显示为不同的旅程。下面的示例源数据

客户级别所需的输出:

规则:1) 由于客户1001在P10结束日期之前开始使用P11产品,因此应该是一个连续的旅程,开始日期应该在第1行,结束日期应该在第2行。

  1. 第 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)