有这样一句SQL,
SELECT *
FROM test.capacity_preference_test;
它能查出下面这样的结果,要求对第一列demand_cluster进行group by,分组后的结果集从1开始排序。如下图,WXI有俩条记录,那么即将生成的line_no就是1,2
解决方案如下:
SELECT
t.demand_cluster,
t.prod_site_code,
CASE WHEN @demand_cluster_no <> t.demand_cluster
THEN @priority_no := 1
ELSE @priority_no := @priority_no + 1
END AS priority,
@demand_cluster_no := t.demand_cluster AS ignored_value
FROM (
SELECT DISTINCT
demand_cluster,
prod_site_code,
(SELECT @demand_cluster_no := '') AS a,
(SELECT @priority_no := 0) AS b
FROM test.capacity_preference_test) t;
MYSQL会先执行FROM里面的语句,作为一个固定的结果集等待SELECT的筛选。这里的思路就是在FROM中定义变量,然后在SELECT中进行变量的遍历自增
- 在FROM中定义@demand_cluster_no作为group by的主要参考值。定义@priority作为排序用的line_no。并对它们赋初始值
- SELECT对CASA WHEN中,首先判断demand_cluster是否等于当前记录集中当前游标指向的行,如果是,就让priority自增,如果已经不是当前游标指向的行,说明当前group by分好的这一组已经跑完,该到下一个group by的分组了,所以直接设置priority初始值1(重置)
- SELECT中@demand_cluster_no := t.demand_cluster ,代表对结果集中每一行记录处理完后,获取当前的demand_cluster值,以便下一条记录的CASE WHEN判断生效(即@demand_cluster_no <> t.demand_cluster的判断)
执行结果: