Mysql 使用聚合函数从查询中选择非组字段
我有一个表Mysql 使用聚合函数从查询中选择非组字段,mysql,sql,aggregate-functions,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
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服务器,如果有关系的话。谢谢。我个人愿意
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
Gordon的答案是正确的,代码更少,但我更喜欢创建临时表。其他开发者更清楚我在做什么。我个人会这么做
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
Gordon的答案是正确的,代码更少,但我更喜欢创建临时表。其他开发人员更清楚我在做什么。要获得您想要的:
select t.*
from (select tbl.*,
row_number() over (partition by fk order by dateof desc) as seqnum
from tbl
) t
where seqnum = 1
这假定您使用的是具有窗口功能的合理数据库。您没有在问题中指定数据库。要获取所需内容:
select t.*
from (select tbl.*,
row_number() over (partition by fk order by dateof desc) as seqnum
from tbl
) t
where seqnum = 1
这假定您使用的是具有窗口功能的合理数据库。你的问题中没有指定数据库。他在使用MySQL-他在底部指定了,但没有标记它。我是新来的,不确定MySQL和SQL是否太同义。但我尝试了此查询,结果为0。在编写时,它有一些问题,例如第一个SELECT tbl.*,应该是SELECT t.*,否?@dlp。此查询在MySQL中不起作用。Matt的解决方案正适合该数据库。不过,所有其他主要数据库都支持
row\u number()
。他使用的是MySQL——他在底部指定了它,但没有标记它。我是新来的,不确定MySQL和SQL是否太同义。但我尝试了此查询,结果为0。在编写时,它有一些问题,例如第一个SELECT tbl.*,应该是SELECT t.*,否?@dlp。此查询在MySQL中不起作用。Matt的解决方案正适合该数据库。不过,所有其他主要数据库都支持row\u number()
。如果您将连接切换为正确的ANSI连接语法,我将投票支持您。对不起,我一直是一个老派的连接人。很难改掉这个习惯。我正在尝试在世界上做一个小小的改变(推动ANSI join syntax;)。这绝对是正确的方法,而且更清楚您要做什么,所以我有点反驳我的回答:)赢家,尽管有一个小小的改变。dateof根据MySQL是不明确的,所以我把tbl.dateof放在字段列表中。谢谢。如果你把连接转换成正确的ANSI连接语法,我会投票给你。对不起,我一直是一个老派的连接人。很难改掉这个习惯。我正在尝试在世界上做一个小小的改变(推动ANSI join syntax;)。这绝对是正确的方法,而且更清楚您要做什么,所以我有点反驳我的回答:)赢家,尽管有一个小小的改变。dateof根据MySQL是不明确的,所以我把tbl.dateof放在字段列表中。谢谢