Выбор наиболее высоко оцененных результатов из табличной переменной в SQL - PullRequest
0 голосов
/ 28 августа 2009

У меня есть следующая табличная переменная в SQL Server 2005:

DECLARE @results TABLE (id int IDENTITY(1,1),
                        customerId int, 
                        salesId int, 
                        score int,
                        lastServiceDate datetime,
                        PRIMARY KEY(id));

Мне нужен эффективный способ очистки таблицы или доступа к ее результатам, чтобы он возвращал только 1 результат на salesId. Если для salesId имеется более 1 результата, в нем должна отображаться строка с наивысшим баллом или, в случае привязки, самая последняя lastServiceDate из таблицы Customer.

Прямо сейчас мои тестовые данные выглядят так:

id  customerId  salesId  score  lastServiceDate
1   950         418      3      2009-08-09 00:00:00.000
2   951         418      3      2009-08-19 00:00:00.000
3   952         418      1      2009-08-22 00:00:00.000
4   953         419      2      2009-08-15 00:00:00.000

Я хочу что-то, что вернуло бы, в данном случае, только две строки - id 2 (top score / lastServiceDate для salesId 418) и id 4 (только результат для salesId 419). В конце мне нужно взять данные из этой таблицы и вставить их в таблицу JobResult, выбрав customerId и salesId из @results, с этими ограничениями.

(На этом заканчивается вопрос, заданный в https://stackoverflow.com/questions/1343647.)

Ответы [ 2 ]

1 голос
/ 03 сентября 2009

Это вернет данные, которые вы хотите:

SELECT id, salesId, score, lastServiceDate
 from (select id, salesId, score, lastServiceDate
         ,row_number() over(partition by SalesId order by score desc, lastServiceDate desc) ranking
        from @results) xx
 where xx.ranking = 1

, и это удалит нежелательные строки из таблицы, оставив только то, что вы хотите:

DELETE @results
 where id in (select id
               from (select id, salesId, score, lastServiceDate
                       ,row_number() over(partition by SalesId order by score desc, lastServiceDate desc) ranking
                      from @results) xx
               where xx.ranking <> 1)

select * from @results

Я проверил это с данными, которые вы разместили, но обязательно попробуйте это с большими / более сложными наборами данных.

0 голосов
/ 28 августа 2009

Попробуйте это:

  WITH highscore AS (
       SELECT r.salesid,
              MAX(r.score) 'maxscore',
              MAX(t.lastservicedate) 'maxservicedate'
         FROM @results r
     GROUP BY r.salesid)
  SELECT t.customerid,
         t.salesid,
         t.lastservicedate
    FROM @results t
    JOIN highscore hs ON hs.salesid = t.salesid 
                     AND hs.maxscore = t.score
                     AND hs.maxservicedate = t.lastservice
GROUP BY t.customerid,
         t.salesid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...