Вы, вероятно, хотели вернуть спонсора вместе с MAX(savedate)
.
Если вы не заметили, что этот запрос:
SELECT MAX(savedate)
FROM @Table
WHERE ticketid = 101
полностью соответствует вашему решению
select top 1 max(savedate) as date
from @Table
where ticketid = 101
group by sponsor
order by date desc
, будучи гораздо более эффективным.
Кроме того, вы можете просто сделать следующее:
SELECT TOP 1 sponsor, savedate
FROM @Table
WHERE ticketid = 101
ORDER BY
savedate DESC
Обновление:
Этот запрос вернет дату, когда задача была в последний раз назначена текущему спонсору:
declare @Table table (
id int PRIMARY KEY,
ticketid int,
sponsor int,
dev int,
qa int,
savedate datetime
)
insert into @Table values (1,100,22,0, 0, '2008-10-29 11:17:59.527')
insert into @Table values (2,100,5,0, 0, '2008-10-29 11:00:37.030')
insert into @Table values (3,101,22,0, 0, '2009-10-29 11:10:27.687')
insert into @Table values (5,101,44,0, 0, '2008-10-31 12:07:52.917')
insert into @Table values (6,101,32,0, 0, '2009-06-30 08:16:12.343')
insert into @Table values (7,101,44,0, 0, '2009-10-30 10:12:11.369')
insert into @Table values (8,101,44,1, 0, '2009-10-31 10:12:11.369')
;WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY ticketid ORDER BY savedate DESC) AS rn
FROM @Table
)
SELECT rl.sponsor, ro.savedate
FROM rows rl
CROSS APPLY
(
SELECT TOP 1 rc.savedate
FROM rows rc
JOIN rows rn
ON rn.ticketid = rc.ticketid
AND rn.rn = rc.rn + 1
AND rn.sponsor <> rc.sponsor
WHERE rc.ticketid = rl.ticketid
ORDER BY
rc.rn
) ro
WHERE rl.rn = 1
Я добавил еще одну запись для спонсора 44
к данным испытаний.
Запрос вернет строки 1
и 7
, так как спонсор не изменился в строке 8
.