sql 语句,在group by 中选最大值max的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 语句,在group by 中选最大值max的问题相关的知识,希望对你有一定的参考价值。

ID 姓名 开始日期 结束日期 处理方式 备注

1 张三 2015/8/5 2015/10/4

2 李四 2015/8/7 2015/10/6

5 张三 2015/6/5 2015/8/4

表如上面所示, 现在要选出每个员工的最后一个工作周期, 比如张三就只要2015/8/5 开始的那条记录, 结果要包含所有字段,其中ID是关键字, 怎么写?

select a.* from table a,
(select 姓名,max(开始日期) 日期 from table group by 姓名) b where a.姓名=b.姓名 and a.开始日期=b.日期
参考技术A select distinct ID,姓名,开始日期,max(结束日期),处理方式,备注 from 表 group by ID ;追问

这个肯定错, 姓名,开始日期 ,等几个都没有包含进GROUP BY 中

参考技术B select id,姓名,开始日期,结束日期 from (select * from table order by 开始日期 desc) group by name

为啥 MAX 语句需要 Group By?

【中文标题】为啥 MAX 语句需要 Group By?【英文标题】:Why does MAX statement require a Group By?为什么 MAX 语句需要 Group By? 【发布时间】:2021-11-07 19:47:09 【问题描述】:

我理解为什么第一个查询需要GROUP BY,因为它不知道将总和应用于哪个日期,但我不明白为什么第二个查询会出现这种情况。最终是最大金额的值已包含在表中 - 它不像SUM 那样计算。谢谢

-- First Query
select
    sum(OrderSales),OrderDates
From Orders


-- Second Query
select
    max(FilmOscarWins),FilmName
From tblFilm

【问题讨论】:

提示:SSMS 不是数据库,它只是一个与之对话的程序。实际的数据库是 Microsoft SQL Server,因此您需要使用该标签来询问有关它的问题。 【参考方案1】:

需要GROUP BY 的不是SUMMAX,而是未聚合的 列。

如果你只是这样写,你会得到一行,对于整个表中FilmOscarWins 列的最大值:

        select
            max(FilmOscarWins)
        From
            tblFilm

如果任何一部电影获得的奥斯卡奖最多是 12 部,那一排就是 12 部。但可能会有多部电影,所有的电影都获得了 12 部奥斯卡奖,所以如果我们要求在这 12 部旁边加上FilmName,则没有一个答案。

通过添加Group By,我们从根本上改变了查询:而不是返回一个数字整个表,它将返回一行每个组 - 这在这种情况下,表示每部电影有一行。

如果您确实想获得所有获得最多 12 座奥斯卡奖的电影的列表,则必须执行一些更复杂的操作,例如使用子查询首先找到单个数字 (12),然后找到所有匹配它的行:

select
     FilmOscarWins,
     FilmName
From
     tblFilm
Where FilmOscarWins = (
        select
            max(FilmOscarWins)
        From
            tblFilm
)    

【讨论】:

谢谢。如果只有一个答案,比如只有 1 条记录的最大值,是否仍然会出现错误,因为解释器(我认为这就是 SMSS 是什么?)根本不会让这样的查询存在,即使这样可以做一张桌子吗? 是的,数据库(SQL Server 本身,而不是 SSMS;尽管 SSMS 可能会发现问题并给您提前警告)会拒绝查询,因为 不合逻辑,甚至在查看之前数据。 (您可能会遇到的一个例外是在不同的数据库系统 MySQL 中,它具有允许查询并有效地随机选择一行的模式;通常认为最好关闭该模式。) 是的,因为查询是在执行之前解析和编译的,所以它必须在语法和功能上正确;在执行查询之前,SQL Server 无法知道要查找哪些数据,此时执行计划已经存在。此外,考虑一下如果 SQL Server 确实 允许您的语法会发生什么,因为它在编译时检查数据 - 一旦数据发生更改,执行计划就会失效并且缓存不再有意义.【参考方案2】:

如果您想要获得奥斯卡奖最多的电影,请使用select top

select top (1) f.*
From tblFilm f
order by FilmOscarWins desc;

在聚合查询中,select 列需要与group by 列保持一致——select 中未聚合的列必须与group by 匹配。

【讨论】:

以上是关于sql 语句,在group by 中选最大值max的问题的主要内容,如果未能解决你的问题,请参考以下文章

sql查询中如何用group by查询出完整的一行记录?

sql语言 怎么求每组最大,就是用group by 分组后,求每组某列最大?

为啥 MAX 语句需要 Group By?

sql group by 之后 如何合并分组的文本

sql group by 之后 如何合并分组的文本

SQL中group by语句有何作用?