有两条类似的数据,但是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 @ 2024-03-28 10:26  丶Ronnie  阅读(19)  评论(0)    收藏  举报