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
最大的那条记录。