J'ai un ensemble de données ont des enregistrements en double et je fais un rang (en num) à dedup. C'était bien pendant que je le grouper et voir à quel point la duplication est mauvaise. mais où j'exécute une requête pour obtenir rank = 1 (où rank = 1), la requête prend trop de temps et se bloque.Classement se bloque avec Where Clause
Quelqu'un peut-il me donner un aperçu?
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;
Sortie:
--------------
Num | Count(*)
--------------
1| 302419
2| 7259
3| 471
4| 43
5| 2
obtenir une table uniquement rang = 1 et Crashs/trop long:
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;
L'utilisation de concat_ws au lieu de deux affectations semble plus efficace mais reste la même. Il continue à courir et ne donne pas de résultat. – Toby
@Toby. . . Ce n'est pas une question d'efficacité. c'est sur la précision. –
Merci @Gordon Linoff. Je suis nouveau à SQL, corrigez-moi si je me trompe. Je pense que c'est plus efficace si la requête n'a besoin de vérifier qu'une seule affectation. Je suis d'accord que cela améliore la précision. - Une chose que je suis confus est que je suis capable de faire un compte après l'avoir groupé. Comment se fait-il qu'il y ait un problème pour présenter les données avec le rang de condition = 1. - Cela ne fonctionne toujours pas. est-il possible de contourner ce problème? Je pense plutôt faire une requête, peut-être que je peux ajouter une colonne pour le classement et supprimer tout rang> 1. – Toby