0

最も早い日付と最も遅い日付をラベル付けすることにより、識別子を指定して、1 年間隔内の日付をグループ化しようとしています。その日付から 1 年以内に日付がない場合は、それ自体の日付が最初と最後の日付として記録されます。たとえば、元のデータは次のとおりです。

id | date 
____________
a  | 1/1/2000
a  | 1/2/2001
a  | 1/6/2000
b  | 1/3/2001
b  | 1/3/2000
b  | 1/3/1999
c  | 1/1/2000
c  | 1/1/2002
c  | 1/1/2003

そして、私が望む出力は次のとおりです。

id  | first_date | last_date
___________________________
a   | 1/1/2000   | 1/2/2001
b   | 1/3/1999   | 1/3/2001
c   | 1/1/2000   | 1/1/2000
c   | 1/1/2002   | 1/1/2003

私は一日中これを理解しようとしてきましたが、理解できません。ケースIDの重複が2つしかない場合は実行できますが、それ以上の値は実行できません。どんな助けでも素晴らしいでしょう。

4

3 に答える 3

1
SELECT id
     , min(min_date) AS min_date
     , max(max_date) AS max_date
     , sum(row_ct)   AS row_ct
FROM  (
   SELECT id, year, min_date, max_date, row_ct
        , year - row_number() OVER (PARTITION BY id ORDER BY year) AS grp
   FROM  (
      SELECT id
           , extract(year FROM the_date)::int AS year
           , min(the_date) AS min_date
           , max(the_date) AS max_date
           , count(*)      AS row_ct
      FROM   tbl
      GROUP  BY id, year
      ) sub1
   ) sub2
GROUP  BY id, grp
ORDER  BY id, grp;

1) id, yearsubquery で、( )ごとにすべての行をグループ化しますsub1。日付の最小値と最大値を記録します。row_ctデモ用に行数 ( ) を追加しました。

row_number()2) 2 番目のサブクエリで年から を引きsub2ます。したがって、連続するすべての行が同じグループになります ( grp)。年の差が新しいグループを開始します。

3)最後SELECTの で、今度は ( id, grp) ごとにもう一度グループ化し、最小値、最大値、および行数を再度記録します。出来上がり。探している結果を正確に生成します。

-> SQLfiddle デモ。

関連する回答:
年の範囲として年の配列を返す
繰り返し属性によるグループ化

于 2013-09-12T23:45:33.260 に答える
0
select id, min ([date]) first_date, max([date]) last_date
from <yourTbl> group by id
于 2013-09-12T20:54:30.330 に答える