使用聚合函数从查询中选择非组字段

时间:2013-02-15 20:11:26

标签: mysql sql aggregate-functions

我有一个包含三列的表tbl

id | fk | dateof
 1 |  1 | 2012-01-01
 2 |  1 | 2012-01-02
 3 |  2 | 2012-02-01
 4 |  2 | 2012-03-01
 5 |  3 | 2012-04-01

id是行的ID,fk是另一个表的外键,dateof是日期列。

我想要的是id获取dateof最新的fk分组。我尝试了什么:

SELECT id, MAX(dateof) FROM tbl GROUP BY fk

但我得到的结果如下:

1 | 2012-01-02
3 | 2012-03-01
5 | 2012-04-01

我想要的时候:

2 | 2012-01-02
4 | 2012-03-01
5 | 2012-04-01

如何查询并获取我正在寻找的结果? MySQL服务器是否重要。感谢。

2 个答案:

答案 0 :(得分:4)

就我个人而言

SELECT id, tbl.dateof dateof
FROM tbl 
INNER JOIN
 (SELECT fk, MAX(dateof) dateof 
  FROM tbl 
  GROUP BY fk) temp
ON tbl.fk = temp.fk AND tbl.dateof = temp.dateof

戈登的答案是正确的,代码较少,但我更喜欢创建临时表。其他开发人员对我正在做的事情更清楚。

答案 1 :(得分:0)

获得你想要的东西:

select t.*
from (select tbl.*,
             row_number() over (partition by fk order by dateof desc) as seqnum
      from tbl
     ) t
where seqnum = 1

这假设您使用的是具有窗口函数的合理数据库。您没有在问题中指定数据库。