2012-01-27 16 views
4

私は四半期で、私の販売代理店の売上のテーブルを持っている:この結合を行うより良い方法はありますか?

 
Agent   Quarter Sales 
---------------------------- 
Alex Andersen 2011Q1 358 
Alex Andersen 2011Q2 289 
Alex Andersen 2011Q3  27 
Alex Andersen 2011Q4 2965 
Brian Blogg 2010Q3 277 
Brian Blogg 2010Q4 123 
Brian Blogg 2011Q1 783 
Brian Blogg 2011Q2  0 
Christy Cliff 2011Q2 777 
Christy Cliff 2011Q3 273 
Christy Cliff 2011Q4 111 
Christy Cliff 2012Q1 901 

はその四半期の各エージェントの早い四半期の売上高を取得するための最も簡単な、最も効率的なクエリは何ですか?

それは「各エージェントの第一四半期は何ですか?」を見つけるのは簡単だ:

SELECT agent, min(quarter) FROM salestable GROUP BY agent 

しかし、これは売上高が含まれていないので、私は私が参加するんだろうと思って:

SELECT agent, sales 
FROM salestable s1 
JOIN 
(
    SELECT agent AS e, MIN(quarter) AS q 
    FROM salestable 
    GROUP by employee 
) AS q1 ON q1.e=s1.agent AND q1.mq=s1.quarter 

これは私のデータセットでは受け入れがたいほど遅いです。カーソルを使用することができれば、テーブルを1回だけ通過するだけですが、クエリを使用すると結合が必要なようです。そうですか?

+2

あなたのクエリがよさそうだ...私はカーソルが何かを改善するとは思わない...何インデックスあなたは 'salestable'に持っています? –

+1

'(エージェント、四半期)'インデックスがありますか? –

+0

インデックスが(エージェント、四半期)であることを確認してください。カーソルを使用すると、クエリが瞬間的になります。投稿したクエリを使用すると10分かかります。 ??? – AnotherParker

答えて

6

このバリエーションを試してみて、それが任意のより良いですかどうかを確認:

WITH cteRowNum AS (
    SELECT agent, quarter, sales, 
      ROW_NUMBER() OVER (PARTITION BY agent ORDER BY quarter) AS RowNum 
     FROM salestable 
) 
SELECT agent, quarter, sales 
    FROM cteRowNum 
    WHERE RowNum = 1; 
関連する問題