mysql之row
作者:mmseoamin日期:2023-12-13

1.语法

#将字段按照COLUMN1分组COLUMN2排序后分配一个从1开始升序的编号

SELECT *, ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2 ) AS NUM FROM TABLE;
  • PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。
  • PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。
  • ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。ORDER BY子句是必须的,因为ROW_NUMBER()函数对顺序敏感

    2.举例

    1.将商品表中的价格按升序排序并编号

    SELECT goods_price,goods_user_id,ROW_NUMBER() over(ORDER BY goods_price) as num  FROM  goods

    运行结果:

    mysql之row,第1张

    结果新增了一列来标记行号

    2.将商品按用户分组后价格降序并编号

    SELECT goods_price,goods_user_id,ROW_NUMBER() over(PARTITION BY goods_user_id ORDER BY goods_price desc) as num FROM goods

    运行结果:

    mysql之row,第2张

    结果会按每一个用户进行分区,按价格降序排序后,按顺序编号。

    3.将商品按用户分组后价格降序并编号且只查询编号为1的记录

    SELECT * FROM 
    (SELECT goods_price,goods_user_id,ROW_NUMBER() over(PARTITION By goods_user_id ORDER BY goods_price desc) as num FROM  goods) as a  
    WHERE a.num=1

    运行结果:

    mysql之row,第3张

    可以看到在上述基础上过滤出了编号为1的记录。