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

我整天都在试图弄清楚这一点,但无法弄清楚。我可以为只有 2 个重复的案例 id 做到这一点,但不能为更大的值。任何帮助都会很棒。

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;

id, year1)在子查询中按 () 对所有行进行分组sub1。记录日期的最小值和最大值。我添加了行数 ( row_ct) 用于演示。

row_number()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 回答
0

使用这个(SQLFiddle Demo):

SELECT id,
    min(date) AS first_date,
    max(date) AS last_date
FROM mytable
GROUP BY 1
ORDER BY 1
于 2013-09-12T21:05:40.397 回答