如何在SQL中以MAX(Column value),DISTINCT by MULTIPLE columns选择行

时间:2018-11-20 20:50:44

标签: mysql sql max distinct

我的桌子是:

id  env       date      name    PI # 
---|-----|------------|--------|-----
 1 | 10  | 04/03/2009 |   john | 399 
 2 | 11  | 04/03/2009 |  juliet| 244 
 5 | 12  | 04/03/2009 |  borat | 345
 3 | 10  | 03/03/2009 |  john  | 399
 4 | 11  | 03/03/2009 | juliet | 244
 6 | 12  | 03/03/2009 |  borat | 500
 7 | 13  | 24/12/2008 |  borat | 650
 8 | 13  | 01/01/2009 |  borat | 650

此帖子对以下问题进行了稍微的修改。

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

区别在于我想选择每个不同的环境,并选择保存日期最大值的PI#。例如,当两行具有相同的env且其PI号相同(行3和1、2、4、7和8)时,我想返回具有最大日期的行。

下面是期望的结果。

id  env     date      name    PI # 
---|----|------------|--------|----
 1 | 10 | 04/03/2009 | john   | 399
 2 | 11 | 04/03/2009 | juliet | 244
 5 | 12 | 04/03/2009 | borat  | 345
 6 | 12 | 03/03/2009 | borat  | 500
 8 | 13 | 01/01/2009 | borat  | 650

3 个答案:

答案 0 :(得分:1)

典型方法使用相关子查询:

select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.env = t.env);

也许更好的方法是:

select t.*
from t
where t.id = (select t2.id
              from t t2 
              where t2.env = t.env
              order by t2.date desc, t2.id desc
              limit 1
             );

这会稍微好一点,因为(1)id可能是主键,因此匹配速度更快; (2)如果同一日期有多行,则仅返回一行。

答案 1 :(得分:0)

您可以使用以下方法获得所需的结果:

select *
  from tab 
 where (env,date,PI) in
(
select env, max(date) as date, PI
  from tab
 group by env, PI  
);

 id env    date     name     PI
 -- --- ---------- -------  ----
 1  10  04.03.2009  john    399
 2  11  04.03.2009  juliet  244
 5  12  04.03.2009  borat   345
 6  12  03.03.2009  borat   500
 8  13  01.01.2009  borat   650

Rextester Demo

答案 2 :(得分:0)

我想这就是您想要的:

SELECT * FROM (SELECT DISTINCT table1.env, table1.PI FROM table1) AS q 
INNER JOIN table1 AS t ON (q.PI = t.PI) AND (q.env = t.env)
WHERE t.date = (SELECT MAX(table1.date) FROM table1 WHERE table1.env = t.env AND table1.PI=t.PI)