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;
也许这会解决您的问题。
我有一个数据集有重复的记录,我正在对去重进行排序(按数字)。当我将它分组并查看重复有多糟糕时它很好。但是在我 运行 获取 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;
也许这会解决您的问题。