有更好的方法来进行这个连接吗?

4
我有一张按季度分类的销售代理销售表格:
代理人         季度 销售额
----------------------------
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上有哪些索引? - Michael Fredrickson
1
你有一个 (Agent, Quarter) 索引吗? - ypercubeᵀᴹ
很确定索引是(代理商,季度)。使用游标使查询变得即时。使用我发布的查询需要10分钟。??? - AnotherParker
你查询的是不是一个视图而不是表格? - JeffO
1个回答

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接