Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从具有重叠时间段的多个维度的连续事务中导出开始日期和结束日期?_Sql_Teradata - Fatal编程技术网

Sql 如何从具有重叠时间段的多个维度的连续事务中导出开始日期和结束日期?

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

我使用的是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

我已经能够用游标到达那里,但它需要太长的时间,所以我想知道这是否可以在使用无界前缀等的查询中完成。。。但我对这些功能并不十分熟悉


谢谢你的帮助

这是一个缺口和孤岛问题。您可以使用行号的差异:

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日的
没有行,该怎么办?