mysql使用ROW_NUMBER窗口函数生成一个从 1 开始的递增数字
·
ROW_NUMBER() OVER ( PARTITION BY d.string_value ORDER BY a.create_time DESC ) AS rn
ROW_NUMBER() OVER (PARTITION BY d.string_value ORDER BY a.create_time DESC) AS rn 是一个窗口函数的用法。它的作用是根据指定的分组和排序条件,为每行分配一个唯一的递增编号。我们可以分解并详细说明这段代码的含义:
-
ROW_NUMBER():ROW_NUMBER()是一个窗口函数,用来生成一个从1开始的递增数字,给每行分配一个编号。- 不同于直接排序,它允许我们在数据分组的基础上编号,因此非常适合在分组内做排序、筛选等操作。
-
OVER子句:OVER子句定义了窗口函数的应用范围。- 在这里,
OVER子句包含了PARTITION BY和ORDER BY,指定了分组和排序的规则。
-
PARTITION BY d.string_value:PARTITION BY用来分组,将数据根据d.string_value的不同值划分成多个分组。- 比如,
d.string_value有两个值1和2,那么PARTITION BY d.string_value会将数据分成两个分组,分别是string_value = 1和string_value = 2。
-
ORDER BY a.create_time DESC:ORDER BY用于在分组内排序。在每个分组中,它会根据a.create_time进行降序排列。DESC表示降序,时间越新的数据排在前面。- 这样,每个分组中,最新的记录将获得编号
1,然后依次递增。
-
AS rn:AS rn是为生成的编号列取一个别名rn,用于后续查询引用。示例解释
假设我们有以下数据:
apply_id string_value create_time 1 1 2024-01-01 10:00 2 1 2024-01-02 10:00 3 2 2024-01-01 10:00 4 2 2024-01-03 10:00 在
PARTITION BY和ORDER BY的作用下,ROW_NUMBER()会这样分配编号:apply_id string_value create_time rn 2 1 2024-01-02 10:00 1 1 1 2024-01-01 10:00 2 4 2 2024-01-03 10:00 1 3 2 2024-01-01 10:00 2 这样,通过
rn列,我们可以方便地选择每种string_value分组的前几条记录,比如rn <= 5表示每组的前五条。
更多推荐


所有评论(0)