Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用聚合函数从查询中选择非组字段_Mysql_Sql_Aggregate Functions - Fatal编程技术网

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放在字段列表中。谢谢