Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
Teradata Sql查询_Sql_Group By_Teradata - Fatal编程技术网

Teradata Sql查询

Teradata Sql查询,sql,group-by,teradata,Sql,Group By,Teradata,我的数据如下表所示(3列): 现在,我想使用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查询实现这一点,这里有一种方法: SELECT name , grp , M

我的数据如下表所示(3列):

现在,我想使用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查询实现这一点,这里有一种方法:

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;
其思想是确定每个日期序列的结束时间。当下一个开始日期比给定的结束日期晚一天时,序列将继续。这就是最里面的子查询所做的


然后,为每个名称计算“结束”的累计总和。具有相同“grp”值的所有行都在一个序列中。然后外部查询将它们聚合在一起。

您可以尝试执行如下查询

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

在TD13.10中,您可以为时段使用一个新的时间序列函数,TD_NORMALIZE_OVERLAP_MEET或TD_NORMALIZE_MEET,它将所有相交的行(一行结束=下一行开始)和/或重叠的行(一行结束>下一行开始)组合在一起

根据定义,期间的结束日期是独占的,因此您必须通过添加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

节食者

你到底想达到什么目标?如何区分
Name='A'
所在的行?@ChrisCamp基本上我希望尽可能多地将对应于COumn Name特定值的行分组。如果您看到,输出有两行用于Name=A,但第一行是Name=A输入表中前两行的组合。类似地,Name=A输出的第二行是Name=A输入表中第5行和第6行的组合。这有帮助吗?
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