Teradata Sql查询
我的数据如下表所示(3列): 现在,我想使用Terdata 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
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