2017-01-02 2 views
0

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; 

Répondre

0

Vous ne pouvez pas dépendre des affectations variables qui se produisent dans deux expressions différentes . La bonne façon de calculer le rang est de combiner toutes les expressions variables en une seule expression. J'écrirais l'expression comme:

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; 

Peut-être que cela va résoudre votre problème.

+0

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

+0

@Toby. . . Ce n'est pas une question d'efficacité. c'est sur la précision. –

+0

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