Группа SQL по одному полю и порядок по другому полю - PullRequest
2 голосов
/ 29 октября 2009

Таблица:

declare @Table table (    
 id int,    
 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-31 10:12:11.369')

Я пытаюсь выбрать 1 максимальный предел сохранения, где recordid - это определенная запись, сгруппированная по спонсору.

Мой прогресс:

select max(savedate)
from @Table
where ticketid = 101
group by sponsor

Возвращает

2009-10-29 11:10:27.687
2009-06-30 08:16:12.343
2009-10-31 10:12:11.370

Закрыть, я сгруппирован правильно, но я хочу, чтобы топ-1 была самой последней датой. Итак, я делаю это:

select top 1 max(savedate)
from @Table
where ticketid = 101
group by sponsor

Возвращает

2009-10-29 11:10:27.687

Woohoo, понял, время для перерыва .. подождите .. это не самое последнее свидание! Давайте попробуем упорядочить их по saveate

select top 1 max(savedate)
from @Table
where ticketid = 101
group by sponsor
order by savedate desc

О нет! Страшные:

"Столбец" @ Table.savedate "недопустим в предложении ORDER BY, потому что это не содержится ни в совокупности функция или предложение GROUP BY. "

Но сохраненные данные агрегируются в списке выбора! Как мне делать то, что я хочу делать?

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

Набрав эту вещь и убедившись, что я не пропустил детали, я пришел к ответу в самом конце. Я решил добавить его в любом случае, чтобы я или кто-либо другой мог найти его позже, если они так близоруки, как в этом случае.

select top 1 max(savedate) as date
from @Table
where ticketid = 101
group by sponsor
order by date desc

макс (сохранено) не то же самое, что и сохранено! Псевдоним, а затем ссылка на агрегат работал отлично:

2009-10-31 10:12:11.370

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 29 октября 2009

Вы, вероятно, хотели вернуть спонсора вместе с 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.

0 голосов
/ 29 октября 2009
select top 1 max(savedate)
from @Table
where ticketid = 101
group by sponsor
order by max(savedate) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...