我使用的是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 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
我已经能够使用游标到达那里,但它花费的时间太长了,所以我想知道这是否可以在查询中完成,比如UNBOUNDED等。但我对这些函数并不是很熟悉。
感谢您的帮助!
发布于 2019-11-26 15:09:24
这是一个缝隙和岛屿问题。您可以使用行号的差异:
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;
发布于 2019-11-26 18:20:16
它不是真正的缝隙和孤岛,它是对重叠行的规范化。Teradata有一个很好的SQL扩展来解决这个问题,但它只适用于PERIODs:
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
https://stackoverflow.com/questions/59053825
复制相似问题