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