Sql 如何从具有重叠时间段的多个维度的连续事务中导出开始日期和结束日期?
我使用的是Teradata 16.20。我有一个很大的事务表,其中包含如下所示的记录Sql 如何从具有重叠时间段的多个维度的连续事务中导出开始日期和结束日期?,sql,teradata,Sql,Teradata,我使用的是Teradata 16.20。我有一个很大的事务表,其中包含如下所示的记录 CALDR_DT PERNR LOC MATNR 11/1/2019 111 L1 M1 11/2/2019 111 L1 M1 11/3/2019 111 L1 M1 11/4/2019 999 L1 M1 11/5/2019 999 L1 M1 11/6/2019 999 L1 M1 11/7/2019 111 L1 M1 11/8/2019 111
CALDR_DT PERNR LOC MATNR
11/1/2019 111 L1 M1
11/2/2019 111 L1 M1
11/3/2019 111 L1 M1
11/4/2019 999 L1 M1
11/5/2019 999 L1 M1
11/6/2019 999 L1 M1
11/7/2019 111 L1 M1
11/8/2019 111 L1 M1
11/9/2019 111 L1 M1
11/10/2019 111 L1 M1
所需输出为:
STRT_DT END_DT PERNR LOC MATNR
11/1/2019 11/3/2019 111 L1 M1
11/4/2019 11/6/2019 999 L1 M1
11/7/2019 12/31/9999 111 L1 M1
我已经能够用游标到达那里,但它需要太长的时间,所以我想知道这是否可以在使用无界前缀等的查询中完成。。。但我对这些功能并不十分熟悉
谢谢你的帮助 这是一个缺口和孤岛问题。您可以使用行号的差异:
select pernr, matr, min(CALDR_DT), max(CALDR_DT)
from (select t.*,
row_number() over (partition by matnr order by CALDR_DT) as seqnum,
row_number() over (partition by matnr, pernr order by CALDR_DT) as seqnum_1
from t
) t
group by (seqnum - seqnum_1), matnr, pernr;
这不是真正的间隙和孤岛,而是规范化重叠行。Teradata有一个很好的SQL扩展来解决这个问题,但它只适用于以下时段:
SELECT NORMALIZE -- normalize overlapping periods
PERIOD(CALDR_DT, CALDR_DT+1) AS pd -- make the date a single day PERIOD
,PERNR
,LOC
,MATNR
FROM mytable
这会产生一个句点,但您可以将其拆分回两个单独的列:
SELECT
Begin(pd)
,Last(pd)
,PERNR
,LOC
,MATNR
FROM
(
SELECT NORMALIZE -- normalize overlapping periods
PERIOD(CALDR_DT, CALDR_DT+1) AS pd -- make the date a single day PERIOD
,PERNR
,LOC
,MATNR
FROM mytable
) AS dt
有趣!我不知道这个问题也有个名字。刚刚在实际的表格上进行了测试,结果正是我们想要的!非常感谢你!如果缺少日期,例如2019年8月11日的
没有行,该怎么办?