从SQL中的表变量中选择得分最高的结果

时间:2009-08-28 15:44:09

标签: sql sql-server-2005 insert

我在SQL Server 2005中有以下表变量:

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

我需要一种有效的方法来清理表或访问表的结果,这样每个salesId只返回1个结果。如果每个salesId的结果超过1,则应该显示得分最高的行,或者如果是平局,则显示Customer表中最新的lastServiceDate。

现在,我的测试数据如下所示:

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(salesId 418的最高分/ lastServiceDate)和id 4(仅对salesId 419的结果)。最后,我需要获取此表中的数据,并将其插入到JobResult表中,从@results中选择customerId和salesId,并具有这些限制。

(这完成了https://stackoverflow.com/questions/1343647中提出的问题。)

2 个答案:

答案 0 :(得分:1)

这将返回您想要的数据:

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

我使用您发布的数据对此进行了测试,但请务必使用更大/更复杂的数据集进行测试。

答案 1 :(得分:0)

试试这个:

  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