首页 > 解决方案 > mysql对多行特定条件进行排名

问题描述

我有这张桌子

在此处输入图像描述

我想根据 cust_id、月份、年份、transaction_no 和输出来对每一行进行排名,但仅针对本例中的特定标准。

在此处输入图像描述

标准是相同的 cust_id、月、年。

什么是查询?谢谢你。

标签: mysql

解决方案


如果您使用的是 MySQL 8+,那么ROW_NUMBER可以在这里使用:

SELECT
    cust_id,
    month,
    year,
    transaction_no,
    ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY year, month) `rank`
FROM yourTable
ORDER BY
    cust_id DESC,
    year,
    month;

根据您实际想要的确切排名行为(从您的示例数据中不清楚),您可能需要替换ROW_NUMBERRANKDENSE_RANK

编辑:

在 MySQL 5 上,我们或许可以使用相关计数查询来查找排名数字:

SELECT
    cust_id,
    month,
    year,
    transaction_no,
    (SELECT COUNT(*)
     FROM yourTable t2
     WHERE t2.cust_id = t1.cust_id AND
           (t2.year < t1.year OR t2.year = t1.year AND t2.month <= t1.month)) `rank`
FROM yourTable t1
ORDER BY
    cust_id DESC,
    year,
    month;

这种方法可以假设,对于每个cust_idyearmonth值组合总是唯一的。

这是查询的第二个 5.7 兼容版本的演示

来自 5.7 版本查询的屏幕截图


推荐阅读