繁体   English   中英

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

[英]How to aggregate data with slowly changing dimension

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

在 Teradata 上,我有一个 SCD2 变化(缓慢变化的维度)的第一个表 table1,所以每条记录都有一个开始和结束日期。

数据集

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

预期成绩

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

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

实际结果

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

请问如何从数据集表 1 创建我的表 2?

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

这可以看作是一个间隙和孤岛问题。 您想将具有相同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 支持完全按照您的要求执行的语法,但它仅适用于句点 幸运的是,您的 StartDate 和 EndDate 可以使用period(StartDate, EndDate+1)组合成一个 Period(包括开始,但标准 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

还有一个规范化的 table ,但同样,仅适用于 Periods。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM