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

问题描述 投票:62回答:7

这是我想要做的。假设我有这张桌子t:

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

对于每个ID,我要选择包含最小record_date的行。所以我会得到:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2009-06-01  | a

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

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2011-04-03  | b
19 | 2009-06-01  | a
sql group-by max distinct min
7个回答
80
投票

怎么样:

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有重复。


13
投票

我只需在中执行此操作即可获得您的预期结果:

 SELECT id, min(record_date), other_cols 
  FROM mytable
  GROUP BY id

这对您有用吗?


7
投票

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

    SELECT categoryid,
       productid,
       productName,
       unitprice 
    FROM products a WHERE unitprice = (
                SELECT MIN(unitprice)
                FROM products b
                WHERE b.categoryid = a.categoryid)

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


2
投票

我想在这里添加一些其他答案,如果您不需要first项,但是说出第二个数字,例如,您可以在子查询中使用rownumber并将结果集基于该数字。

SELECT * FROM
(
    SELECT
        ROW_NUM() OVER (PARTITION BY Id ORDER BY record_date, other_cols) as rownum,
        *
    FROM products P
) INNER
WHERE rownum = 2

这还允许您在子查询中对多列进行排序,如果两个record_date具有相同的值,则可能会有所帮助。如果需要,您还可以通过用逗号分隔来分隔多个列。


1
投票

这很简单:


0
投票

这是一个古老的问题,但这对某人可能有用就我而言,我不能使用子查询,因为我有一个大查询,并且我需要在结果中使用min(),如果我使用子查询,则数据库需要重新执行我的大查询。我正在使用Mysql


0
投票

下面的查询采用每个工作订单的第一个日期(在显示所有状态更改的表中:]

© www.soinside.com 2019 - 2024. All rights reserved.