问题描述
我会在此问题上提供任何帮助。我已经花了几个小时没有任何真正的解决方案。 我有一个 sql
SELECT to_place,rank
FROM
(SELECT g1.to_place as to_place,g1.pcount as pcount,@rank := IF(@current_to_place = g1.to_place,@rank + 1,1) AS rank,@current_to_place := g1.to_place
FROM
(select
to_place,count(*) as pcount
from temp_workflows
group by to_place
order by to_place,pcount desc) g1
ORDER BY g1.to_place,g1.pcount DESC) ranked
在表 g1 中,我将我的数据分组以找到最常见的 to_place。然后我想按升序排列这些出现(以便我以后可以选择每个 to_place 类别中最常见的前 3 个。
问题是用户定义的变量是不可预测的(@rank 有时总是 1),这可能与以下事实有关:在一个语句中,我不应该引用同一个变量 (current_to_place)。我阅读了很多关于使用单独语句等的信息,但我可以找到一种以不同方式编写语句的方法。如何在别处定义 @current_to_place 以便结果相同? 预先感谢您的帮助。
解决方法
我认为您应该测试 pcount 以获得排名,并且您应该初始化变量
DROP TABLE IF EXISTS T;
CREATE TABLE T
(to_place int);
insert into t values (1),(2),(3),(3);
SELECT to_place,rank
FROM
(
SELECT g1.to_place as to_place,g1.pcount as pcount,@rank := IF(@current_to_place <> pcount,@rank + 1,1) AS rank,@current_to_place := pcount
FROM
(select
to_place,count(*) as pcount
from t
group by to_place
order by to_place,pcount desc) g1
cross join(select @rank:=0,@current_to_place:=0) r
ORDER BY g1.pcount DESC
)
ranked
+----------+------+
| to_place | rank |
+----------+------+
| 3 | 1 |
| 2 | 2 |
| 1 | 3 |
+----------+------+
3 rows in set (0.016 sec)