如何选择最大值(column value)的行,在sql中由多个列分隔

y1aodyip  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(462)

这个问题在这里已经有答案了

sql仅选择列上具有最大值的行[重复](27个答案)
两年前关门了。
我的table是:

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

这篇文章对下面的问题稍加修改。
如何选择最大值(列值)的行,与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
7hiiyaii

7hiiyaii1#

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

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)如果同一日期有多行,则只返回一行。

bogh5gae

bogh5gae2#

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

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演示

gorkyyrv

gorkyyrv3#

我想这就是你想要的:

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)

相关问题