有两条类似的数据,但是B.id不同,B.name不同,取B.id最大的那条数据
SELECT *
FROM (
SELECT sc.*, jcl.*, ROW_NUMBER() OVER(PARTITION BY sc.id ORDER BY jcl.id DESC) as rn
FROM A sc
LEFT JOIN B jcl ON jcl.id = sc.id
WHERE sc.id = 116
) t
WHERE t.rn = 1
ROW_NUMBER() OVER(PARTITION BY sc.id ORDER BY jcl.id DESC)
是SQL中窗口函数的一种用法,用于为查询结果集中的每一行赋予一个唯一的行号,行号的顺序是基于指定的分区(PARTITION BY)和排序(ORDER BY)规则。
详细解释如下:
-
ROW_NUMBER()
: 这是一个窗口函数,它会给每一行生成一个连续的行号,从1开始递增。 -
OVER()
: 这个关键字指定了函数应用的范围或窗口。 -
PARTITION BY sc.id
: 表示将整个查询结果集按照sc.id
字段的值进行分区,也就是对于每个不同的sc.id
值,窗口函数都会重新开始计算行号。 -
ORDER BY jcl.id DESC
: 在每个sc.id
分区内部,行号是按照jcl.id
字段的值进行降序排列的,也就是说,jcl.id
值最大的行将获得该分区内的行号1
综上所述,这条表达式的作用是对A
表中每个唯一sc.id
值对应的B
表记录,按照jcl.id
的降序给每条记录分配一个行号,其中jcl.id
最大的记录在每个sc.id
分区中将获得行号1。在后续的查询中通过WHERE t.rn = 1
就可以选择每个sc.id
下jcl.id
最大的那条记录。
分类:
数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现