Where 子句导致排名崩溃

Ranking crashes with Where Clause

我有一个数据集有重复的记录,我正在对去重进行排序(按数字)。当我将它分组并查看重复有多糟糕时它很好。但是在我 运行 获取 rank=1(其中 rank=1)的查询中,查询花费的时间太长而崩溃。

任何人都可以给我一些见解吗?

Select num, count(*)
FROM
(SELECT
 @rank :=case   
WHEN concat_ws(':', @Agent, @calltime) = concat_ws(':', Agent_Name, CallStart) 
Then @rank + 1
ELSE 1
END AS num, 
@calltime:=CallStart AS Callstart, @Agent := Agent_Name As AgentName        
FROM granular 
ORDER BY  Callstart, AgentName
) clean
Group by num;

输出:

--------------
Num | Count(*)
--------------    
   1|   302419
   2|     7259
   3|      471
   4|       43
   5|        2

获得一个 table 只有 rank=1 并且它 crashs/take 太长了:

Select *
FROM
(SELECT
 @rank :=case   
WHEN concat_ws(':', @Agent, @calltime) = concat_ws(':', Agent_Name, CallStart) 
Then @rank + 1
ELSE 1
END AS num, 
@calltime:=CallStart AS Callstart, @Agent := Agent_Name As AgentName        
FROM granular 
ORDER BY  Callstart, AgentName
) clean
WHERE num=1;

您不能依赖发生在两个不同表达式中的变量赋值。计算排名的正确方法是将所有变量表达式组合成一个表达式。我会将表达式写为:

SELECT g.*
FROM (SELECT g.*,
             (@rn := if(@at = concat_ws(':', Agent_name, CallStart), @rn + 1,
                        if(@at := concat_ws(':', Agent_name, CallStart), 1, 1)
                       )
             ) as rn
      FROM granular g CROSS JOIN
           (SELECT @rn := 0, @at := '') params
      ORDER BY  Callstart, AgentName
     ) g
WHERE rn = 1;

也许这会解决您的问题。