2013-02-15 37 views
1

查询我有一个表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,其中dateoffk分组的最新版本。我已经试过:

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服务器,如果它很重要。谢谢。

回答

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 

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

+0

如果您将联接切换为正确的ANSI联接语法,我会让您满意。 – 2013-02-15 20:22:22

+0

对不起,我一直是一个老学校加入的人。很难打破这种习惯。 – 2013-02-15 20:24:25

+0

+1。 。 。我正在尝试在这个世界做一点点改变(推动ANSI连接语法;)。 – 2013-02-15 20:25:53

0

为了得到你想要的东西:

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

这是假设你正在使用具有窗口功能合理的数据库。你不要在你的问题中指定数据库。

+0

他正在使用MySQL - 他指定在底部,但没有标记它 – 2013-02-15 20:21:07

+0

我是新来的,不确定MySQL和SQL是否太同义。我试过这个查询,得到0的结果。在编写时有几个问题,比如第一个SELECT tbl。*,应该是SELECT t。*,no? – dlp 2013-02-15 20:26:13

+0

@dlp。 。 。这个查询在MySQL中不起作用。马特的解决方案是该数据库的正确解决方案。所有其他主要数据库都支持'row_number()'。 – 2013-02-15 20:29:00