2012-01-27 91 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 

但是這對我的數據集來說是無法接受的慢。如果我可以使用遊標,它只需要一次通過表,但使用查詢它似乎需要一個連接。是對的嗎?

+2

您的查詢看起來不錯...我不認爲一個光標將改善什麼...什麼指標做你有你'salestable' ? – 2012-01-27 22:06:57

+1

你有'(代理,季度)'索引嗎? – 2012-01-27 22:13:56

+0

很確定索引是(代理,季度)。使用遊標可以使查詢立即生效。使用我發佈的查詢需要10分鐘。 ??? – AnotherParker 2012-01-27 23:24:37

回答

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; 
相關問題