这就是我想要做的。假设我有这张桌子t:
key_id | id | record_date | other_cols 1 | 18 | 2011-04-03 | x 2 | 18 | 2012-05-19 | y 3 | 18 | 2012-08-09 | z 4 | 19 | 2009-06-01 | a 5 | 19 | 2011-04-03 | b 6 | 19 | 2011-10-25 | c 7 | 19 | 2012-08-09 | d
对于每个ID,我想选择包含最小record_date的行。所以我会得到:
key_id | id | record_date | other_cols 1 | 18 | 2011-04-03 | x 4 | 19 | 2009-06-01 | a
我看到的唯一解决方案是假定所有record_date条目都是不同的,但在我的数据中并非如此。使用带有两个条件的子查询和内部联接将为我提供某些ID的重复行,这是我不想要的:
key_id | id | record_date | other_cols 1 | 18 | 2011-04-03 | x 5 | 19 | 2011-04-03 | b 4 | 19 | 2009-06-01 | a
怎么样:
SELECT mt.* FROM MyTable mt INNER JOIN ( SELECT id, MIN(record_date) AS MinDate FROM MyTable GROUP BY id ) t ON mt.id = t.id AND mt.record_date = t.MinDate
这将获取每个ID的最短日期,然后基于这些值获取值。唯一的重复项是同一ID的最小record_dates重复。