有两条类似的数据,但是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.idjcl.id最大的那条记录。

posted @   丶Ronnie  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示