mysql ROW_NUMBER用法

  在 MySQL 8.0 及更高版本中,ROW_NUMBER() 函数作为窗口函数被引入,这使得在查询结果中为行分配一个唯一编号变得更加直接和简单。

ROW_NUMBER() 函数的基本语法如下:

ROW_NUMBER() OVER (
    [PARTITION BY partition_expression, ...]
    ORDER BY sort_expression [ASC | DESC], ...
)
  • PARTITION BY:可选,用于将数据分为不同的分区,在每个分区内部行号会重新开始。
  • ORDER BY:必须,用于确定行号的分配顺序。

示例 1: 不分区,仅按一列排序

假设你有一个 orders 表,你想要按 order_date 列的升序为所有行分配一个行号。

SELECT 
    order_id, 
    order_date,
    ROW_NUMBER() OVER (ORDER BY order_date) AS row_num
FROM 
    orders;

示例 2: 分区并排序

如果你想为每个客户的订单按 order_date 排序,并为每个分区内的行分配一个行号,你可以这样做:

SELECT 
    customer_id, 
    order_id, 
    order_date,
    ROW_NUMBER() OVER (
        PARTITION BY customer_id
        ORDER BY order_date
    ) AS row_num
FROM 
    orders;

示例 3: 多个列排序

如果你想根据 customer_idorder_date 对订单进行分区和排序:

SELECT 
    customer_id, 
    order_id, 
    order_date,
    ROW_NUMBER() OVER (
        PARTITION BY customer_id
        ORDER BY order_date, order_id
    ) AS row_num
FROM 
    orders;

请注意,ROW_NUMBER() 总是分配连续的数字,而 RANK()DENSE_RANK() 在处理相同排序值时的行为不同。

posted @ 2024-06-24 18:42  使用D  阅读(12)  评论(0编辑  收藏  举报