我的桌子是:
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
答案 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
答案 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)