簡體   English   中英

按行比較間隔日期

[英]Compare interval date by row

我正在嘗試通過給標簽指定最早的日期和最新的日期來在給定標識符的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

我一直試圖解決這一問題,卻無法解決。 對於只有2個重復項的case id,我可以這樣做,但對於較大的值則不能。 任何幫助都會很棒。

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)在子查詢sub1中將每個( id, year )所有行分組。 記錄日期的最小值和最大值。 我添加了一些行( row_ct )進行演示。

2)從第二sub2查詢sub2的年份中減去row_number() 因此,所有連續的行最終都屬於同一組( grp )。 幾年的差距開始了新的團隊。

3)在最后的SELECT ,第二次分組,這次是通過( id, grp )並再次記錄min,max和行數。 瞧。 精確產生您要尋找的結果。

-> SQLfiddle演示。

相關答案:
返回年份的數組作為年份范圍
按重復屬性分組

select id, min ([date]) first_date, max([date]) last_date
from <yourTbl> group by id

使用此( SQLFiddle Demo ):

SELECT id,
    min(date) AS first_date,
    max(date) AS last_date
FROM mytable
GROUP BY 1
ORDER BY 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM