如何聚合具有缓慢变化维度的数据

How to aggregate data with slowly changing dimension

我会尝试用荒谬的英语水平和很难解释的情况来解释我的问题。

在 Teradata 上,我有第一个 table table1,其中 SCD2 发生变化(维度缓慢变化),因此每条记录都有开始和结束日期。

我想创建新的 table (table2),其中除了 table1 中的一列(无用)之外的所有列。很明显,如果没有这一列,我就有重复的行,所以我按所有其他列分组,并计算 min(startdate) 和 max(enddate) 以重新创建历史记录。所以我想要这样的结果:

但我能return的唯一结果是这样的:

select Key, UsefulData, min(EtartDate), max(EndDate)
from table1
group by Key, UsefulData

这样的结果,如果我要分析1月30日的情况,返回2行(UsefulData = 1 and = 0),但事实是UsefulData = 1。

如何从数据集 table 1 创建我的 table 2?

精度:NextRow 的 StartDate 始终是当前行的 EndDate+1。

这读作 gaps-and-island 问题。您想要将具有相同 keyusefuldata.

的“相邻”记录组合在一起

这是一种使用行号之间的差异来定义组,然后聚合的方法:

select key, usefuldata, min(startdate) startdate, max(enddate) enddate
from (
    select t.*,
        row_number() over(partition by key order by startdate) rn1
        row_number() over(partition by key, usefuldata order by startdate) rn2
    from mytable t
) t
group by key, usefuldata, rn1 - rn2

解释它是如何工作的有点复杂。可以先运行子查询,看新组开始时行号的差异如何变化。

Teradata 支持 syntax 完全按照您的意愿行事,但它仅适用于期间。幸运的是,您的 StartDate 和 EndDate 可以使用 period(StartDate, EndDate+1) 合并到一个 Period 中(包括开始,但在 Standard SQL 中排除结束):

select NORMALIZE Key, UsefulData, period(StartDate, EndDate+1) as pd
from table1

如果您想将其拆分回两个单独的列:

select Key, UsefulData, 
   begin(pd) as StartDate, 
   last(pd) as EndDate -- reverts the +1
from
 (
   select NORMALIZE Key, UsefulData, period(StartDate, EndDate) as pd
   from table1
 ) as dt

还有一个 normalized table,但同样只适用于句点。