sql查询当前值到最大值中间的数据

方法一

复制代码
select * from cmp where id >1 and id <= max(id)

很明显这样做是错的

会报错

invalid use of group function

原因是 max是聚合函数, where条件中不能使用聚合函数

为什么呢

这是一个很有意思的问题,仔细地想一下其实很有道理。我们知道,聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的,在筛选过程中依赖"基于已经筛选完毕的数据得出的计算结果"是一种悖论,这是行不通的。更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!而where子句还处于"确定"结果集的过程中,因而不能使用聚集函数。与where子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的having子句。为什么?因为在水平方向上根据外部指定条件的筛选(也就是对行的筛选),where子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过having子句配合聚集函数来完成。

另外,对于having子句再多说一点:没有使用group by而直接使用having子句的例子是不太多见,因为如果没有group by,那么整个结果集就是一个分组,但是这种例子也不是没有,比如当我们需要对"现有的"整个结果集进行"二次筛选"时,就会直接使用having子句了。

因此

方法就是

复制代码
select * from cmp where id > 1 
group by id 
having
  id <= max(id)

或者

复制代码
select * from cmp where id >1 and (select * from cmp where id <=max(id))
相关推荐
Zhu75813 分钟前
在Docker环境部署ApacheGuacamole,对接PG数据库
数据库·docker·容器
Leighteen43 分钟前
Redis与MySQL双写一致性:从问题根源到工程落地
数据库·redis·mysql
AI-好学者1 小时前
阶段二-Cypher查询语言详解
数据库·rag·graphrag
龙仔7252 小时前
SQL Server 批量多库只读账号一键脚本(带逐行注释完整脚本 + 分段逐句详细解释)
服务器·数据库·sql·sqlserver·dba
咏方舟【长江支流】2 小时前
【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读
数据库·架构·开源·ai编程·咏方舟-长江支流·用宝框架
手握风云-3 小时前
Redis:不只是缓存那么简单(十五)
数据库·redis·缓存
weixin_307779133 小时前
Linux下Docker Compose里运行PostgreSQL数据库故障诊断Shell脚本
linux·运维·数据库·docker·postgresql
醉城夜风~3 小时前
MySQL 常用内置函数全解:字符串、数值、日期、流程控制实战教程
数据库·mysql
程序猿秃头之路3 小时前
DDD 系列:实体和值对象详解
数据库·oracle·ddd·领域驱动设计