2017-01-02 15 views
0

データセットに重複レコードがあり、私は除数にランク(As num)を行っています。私はそれをグループ化して重複がどれほど悪いかを見ている間は問題ありませんでした。しかし、私はrank = 1(rank = 1)を取得するためにクエリを実行すると、クエリが時間がかかりすぎてクラッシュします。Where Clauseとのクラッシュ

誰でも私にいくつかの洞察力を与えることができますか?

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を取得し、それが取る長すぎる/ crashs:

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

次の2つの異なる表現で起こる変数の割り当てに依存することはできません。ランクを計算する正しい方法は、すべての変数式を1つの式に組み合わせることです。私は次のような表現を書いています:

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

2つの割り当ての代わりにconcat_wsを使用する方が効率的ですが、それでも同じです。走り続けて結果を出さないだけです。 – Toby

+0

@Toby。 。 。効率性ではありません。それは精度についてです。 –

+0

ありがとう@Gordon Linoff。私はSQLに新しい、私が間違っている場合は私を修正します。私は、クエリが1つの割り当てをチェックする必要がある場合は、より効率的だと思います。私はそれが精度を向上させることに同意します。 - 私が混乱していることの1つは、グループ分け後にカウントできることです。どのようにして、条件ランク= 1のデータを提示するかに問題がある。 - まだ動作していません。回避策はありますか?私は代わりにクエリを実行すると思う、私はランク付けするための列を追加することができます>任意のランク> 1を削除します。 – Toby

関連する問題