2017-01-02 4 views
0

У меня есть набор данных с дублированными записями, и я делаю ранг (как num) для дедупликации. Это было прекрасно, пока я группирую его и вижу, насколько плохим является дублирование. но где я запускаю запрос для получения ранга = 1 (где rank = 1), запрос занимает слишком много времени и сбой.Ранжирование сбоев с предложением Where

Может ли кто-нибудь дать мне некоторое представление?

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 

получить таблицу только ранга = 1 и вылетает/слишком долго:

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; 

ответ

0

Вы не можете зависеть от назначений переменных, которые происходят в двух различных выражений , Правильный способ вычисления ранга - объединить все переменные выражения в одно выражение. Я бы написал выражение как:

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; 

Возможно, это исправит вашу проблему.

+0

Использование concat_ws вместо двух назначений звучит более эффективно, но все равно. Он просто продолжает работать и не дает результата. – Toby

+0

@Toby. , , Речь идет не об эффективности; речь идет о точности. –

+0

Спасибо @ Gordon Linoff. Я новичок в SQL, поправьте меня, если я ошибаюсь. Я думаю, что это более эффективно, если в запросе нужно только проверить одно назначение. Я согласен, что это повышает точность. - Одна вещь, которую я смущает, я могу сделать счет после группировки. Почему возникает проблема с представлением данных с условием rank = 1. - Он все еще не работает. есть ли способ обойти? Я думаю, вместо этого сделаю запрос, возможно, я могу добавить столбец для ранжирования и удаления любого ранга> 1. – Toby

Смежные вопросы