【发布时间】:2022-06-14 15:51:16
【问题描述】:
我目前正在处理一个查询,但我没有得到速度,所以我在问一个问题。
我想找到的是“按 DataID 计算每个类别中最多的名字”。
Data_Category { id : INT PRIMARY KEY AUTO_INCREMENT, 数据标识符:INT, 名称:varchar2(200), 类别:varchar2(200) }
并且可以重复输入。
select dataId, name, category, count(*) as cnt
, rank() over (partition by dataId, category order by count(*) desc) as "ranking"
from data_category
group by dataId, name, category
在上面的查询中,有排名部分和没有排名部分的速度是有区别的。
如果没有rank,则需要0.0053,如果有,则需要0.5秒。
select *, rank() over (partition by A.dataId, A.category order by cnt desc) as "ranking"
from(
select dataId, name, category, count(*) as cnt
from data_category
group by dataId, name, category
) A
上述查询也产生几乎相同的速度。当它被包装在一个 select 语句中时,由于临时表的创建,它正在减慢。
数据约为 400,000 例。
索引是(dataId, category, name)。
我想通过数据ID提取每个类别中名字数量最多的5个名字,但是我无法弄清楚查询的方向。
我将使用此查询创建“视图”。
即使你不写查询,我也真诚地请求一个简单的提示..!
输出:
| dataId | category | name | rank |
|---|---|---|---|
| 1 | cate1 | name1_1 | 1 |
| 1 | cate1 | name1_2 | 2 |
| 1 | cate1 | name1_5 | 3 |
| 1 | cate1 | name1_3 | 4 |
| 1 | cate2 | name2_1 | 1 |
| 1 | cate2 | name2_5 | 2 |
| 1 | cate2 | name2_3 | 3 |
| 2 | cate1 | name3_1 | 1 |
| 2 | cate3 | name3_9 | 1 |
谢谢。
【问题讨论】:
-
Wont a order by count(*) desc limit 5 就足够了(不需要 rank()),因为你只需要前 5 个。
-
我需要对每个dataId和category进行排名。
-
您可能需要检查您的分组,如果需要 - 每个类别中的名称数量按数据 ID,它应该按 dataID、类别、名称分组 - 这意味着类别内的名称和类别内的名称数据ID。
-
是的,没错。我很难写出那个查询。
-
请添加表定义和解释的输出。
标签: mysql performance rank