2017-01-02 1 views
0

Ich habe ein Dataset doppelte Datensätze und ich mache einen Rang (As num) zu deduplizieren. Es war in Ordnung, während ich es gruppiere und sehe, wie schlimm die Vervielfältigung ist. Aber wo ich eine Abfrage ausführen, um Rang = 1 zu erhalten (wobei Rang = 1), dauert die Abfrage zu lange und stürzt ab.Ranking stürzt mit Where-Klausel

Kann mir jemand einen Einblick geben?

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; 

Ausgang:

-------------- 
Num | Count(*) 
--------------  
    1| 302419 
    2|  7259 
    3|  471 
    4|  43 
    5|  2 

eine Tabelle erhalten nur Rang = 1 und es Crashs/​​zu lange dauern:

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; 

Antwort

0

Sie können nicht auf Variablenzuweisungen abhängen, die in zwei verschiedenen Ausdrücken geschehen . Der richtige Weg, den Rang zu berechnen, besteht darin, alle Variablenausdrücke zu einem einzigen Ausdruck zu kombinieren. Ich würde den Ausdruck schreiben als:

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; 

Vielleicht wird dies Ihr Problem beheben.

+0

Die Verwendung von concat_ws anstelle von zwei Zuweisungen klingt effizienter, aber es ist immer noch dasselbe. Es läuft einfach weiter und gibt kein Ergebnis. – Toby

+0

@Toby. . . Es geht nicht um Effizienz; Es geht um Genauigkeit. –

+0

Danke @Gordon Linoff. Ich bin neu in SQL, korrigiere mich, wenn ich falsch liege. Ich denke, es ist effizienter, wenn die Abfrage nur eine Aufgabe überprüfen muss. Ich stimme zu, dass es die Genauigkeit verbessert. - Eine Sache, die ich verwirrt bin, ist, dass ich nach der Gruppierung zählen kann. Wie kommt es zu einem Problem, Daten mit Bedingungsrang = 1 darzustellen? - Es funktioniert immer noch nicht. Gibt es einen Weg, um zu arbeiten? Ich denke stattdessen eine Frage, möglicherweise kann ich eine Spalte für das Ranking hinzufügen und jeden Rang> 1 löschen. – Toby