Есть ли лучший способ сделать это присоединиться? - PullRequest
4 голосов
/ 28 января 2012

У меня есть таблица продаж моих торговых агентов, по кварталам:

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 Ответ

6 голосов
/ 28 января 2012

Попробуйте этот вариант и посмотрите, будет ли он лучше:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...