1

我在表(3 列)中有如下数据:

Name    StartDt         EndDt
 A     01/01/2009    12/31/2009
 A     01/01/2010    11/30/2010
 B     03/01/2011    10/31/2011
 A     04/01/2012    12/31/2012
 A     01/01/2013    08/01/2013

现在我想使用 Terdata Sql 查询创建一个输出,如下所示:

Name    Min_Startdt    Max_Startdt
 A       01/01/2009    11/30/2010
 A       04/01/2012    08/01/2013
 B       03/01/2011    10/31/2011

请告诉我如何通过 Teradata 查询来实现

4

3 回答 3

2

这是一种方法:

SELECT name
     , grp
     , MIN(StartDt)
     , MAX(EndDt)
  FROM (
        SELECT t.*
             , SUM(keepwithnext) 
                   OVER (PARTITION BY  name 
                             ORDER BY startdt 
                         ROWS UNBOUNDED PRECEDING
                        ) AS grp
          FROM (
                 SELECT t.*
                      , CASE WHEN t2.name is null 
                              THEN 0 
                              ELSE 1 
                         END   AS keepwithnext
                   FROM t AS t
                   LEFT OUTER 
                   JOIN t AS t2
                     ON     t.name  = t2.name 
                        AND t.enddt = t2.StartDt - 1
                 ) AS t
        ) AS t
GROUP BY name, grp;

这个想法是确定每个日期序列何时结束。当下一个开始日期比给定的结束日期晚一天时,序列会继续。这就是最里面的子查询所做的。

然后,对于每个名称,计算“ends”的累积总和。具有相同“grp”值的所有行都按顺序排列。然后外部查询将这些聚合在一起。

于 2013-05-24T15:24:29.140 回答
0

你可以尝试做一个看起来像这样的查询

select distinct * from (
    select name,
    min(startdt) over(partition by name) as startdt,
    max(enddt) over(partition by name) as enddt)
    a

这应该工作......

于 2013-05-24T18:34:49.373 回答
0

在 TD13.10 中,您可以将新的时间序列函数之一用于周期,TD_NORMALIZE_OVERLAP_MEET 或 TD_NORMALIZE_MEET,它们组合了所有满足(一行结束 = 下一行开始)和/或重叠(一行结束 > 开始)的行下一行)。

由于 PERIOD 的结束日期根据定义是排他的,因此您必须通过添加 1 来调整 EndDt。

WITH cte(name, pd) AS
 (
   SELECT
      name
      ,PERIOD(StartDt, EndDt+1) AS pd
   FROM dropme
 )
SELECT
   name
   ,BEGIN(pd) AS StartDt
   ,LAST(pd) AS EndDt -- latest including date, same as END(pd)-1
   ,cnt
FROM TABLE (TD_NORMALIZE_OVERLAP_MEET
           (NEW VARIANT_TYPE(cte.name)
            ,cte.pd)
            RETURNS (name VARCHAR(...) 
                    ,pd PERIOD(DATE)
                    ,cnt INTEGER)-- optional, number of rows combined
            HASH BY name
            LOCAL ORDER BY name, pd
        ) AS dt
ORDER BY 1,2

迪特

于 2013-06-27T17:39:52.223 回答