SQL:在选择不同的行时按一个字段中的最小值进行分组

use*_*924 59 sql group-by max distinct min

这就是我想要做的.假设我有这张桌子:

id | record_date | other_cols
18 | 2011-04-03  | x
18 | 2012-05-19  | y
18 | 2012-08-09  | z
19 | 2009-06-01  | a
19 | 2011-04-03  | b
19 | 2011-10-25  | c
19 | 2012-08-09  | d
Run Code Online (Sandbox Code Playgroud)

对于每个id,我想选择包含最小record_date的行.所以我得到:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2009-06-01  | a
Run Code Online (Sandbox Code Playgroud)

我在这个问题上看到的唯一解决方案是假设所有record_date条目都是不同的,但在我的数据中并非如此.使用带有两个条件的子查询和内部联接会给我一些id的重复行,这是我不想要的:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2011-04-03  | b
19 | 2009-06-01  | a
Run Code Online (Sandbox Code Playgroud)

Adr*_*der 75

怎么样的

SELECT mt.*,     
FROM MyTable mt INNER JOIN
    (
        SELECT ID, MIN(Record_Date) MinDate
        FROM MyTable
        GROUP BY ID
    ) t ON mt.ID = t.ID AND mt.Record_Date = t.MinDate
Run Code Online (Sandbox Code Playgroud)

这将获取每个ID的最小日期,然后根据这些值获取值.您有重复的唯一时间是同一ID的最小record_dates重复.

  • 当两个具有相同id和日期的记录存在时,这将无法正常工作吗? (3认同)

Mat*_*ath 13

我可以通过在执行此操作来达到预期的结果:

 SELECT id, min(record_date), other_cols 
  FROM mytable
  GROUP BY id
Run Code Online (Sandbox Code Playgroud)

这对你有用吗?

  • 无论出于何种原因,这似乎在人为的示例中有效(http://sqlfiddle.com/#!2/f8469/6/0),但实际上我得到“列'database.table.col_name'在选择列表,因为它不包含在聚合函数或 GROUP BY 子句中。” 无论如何,我能够让它与阿斯坦德的答案一起工作,谢谢。 (5认同)

DIM*_*IMI 6

要获得每个类别中最便宜的产品,请在相关子查询中使用MIN()函数,如下所示:

    SELECT categoryid,
       productid,
       productName,
       unitprice 
    FROM products a WHERE unitprice = (
                SELECT MIN(unitprice)
                FROM products b
                WHERE b.categoryid = a.categoryid)
Run Code Online (Sandbox Code Playgroud)

外部查询扫描products表中的所有行,并返回单位价格与相关子查询返回的每个类别中的最低价格匹配的产品.