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

浙公网安备 33010602011771号