我在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中提出的问题。)
答案 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