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

1 つのアプローチを次に示します。

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;

アイデアは、日付の各シーケンスがいつ終了するかを決定することです。次の開始日が指定された終了日より 1 日遅れている間、シーケンスは続行されます。これは、最も内側のサブクエリが行うことです。

次に、名前ごとに、「終了」の累積合計を計算します。同じ「grp」値を持つすべての行が連続しています。外部クエリは、これらをまとめて集計します。

于 2013-05-24T15:24:29.140 に答える
0

TD13.10 では、期間の新しい時系列関数の 1 つ TD_NORMALIZE_OVERLAP_MEET または TD_NORMALIZE_MEET を使用できます。これは、一致する (1 つの行の終わり = 次の行の開始) および/または重複する (1 つの行の終わり > の開始) すべての行を結合します。次の行)。

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 に答える
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 に答える