Как совместить GROUP BY и ROW_NUMBER?

Я надеюсь, что следующий пример кода не требует пояснений-:

declare @t1 table (ID int,Price money, Name varchar(10))
declare @t2 table (ID int,Orders int,  Name varchar(10))
declare @relation  table (t1ID int,t2ID int)
insert into @t1 values(1, 200, 'AAA');
insert into @t1 values(2, 150, 'BBB');
insert into @t1 values(3, 100, 'CCC');
insert into @t2 values(1,25,'aaa');
insert into @t2 values(2,35,'bbb');
insert into @relation values(1,1);
insert into @relation values(2,1);
insert into @relation values(3,2);

select T2.ID AS T2ID
,T2.Name as T2Name
,T2.Orders
,T1.ID AS T1ID
,T1.Name As T1Name
,T1Sum.Price
FROM @t2 T2
INNER JOIN (
    SELECT Rel.t2ID
       ,MAX(Rel.t1ID)AS t1ID 
-- the MAX returns an arbitrary ID, what i need is: 
--     ,ROW_NUMBER()OVER(Partition By Rel.t2ID Order By Price DESC)As PriceList
       ,SUM(Price)AS Price
        FROM @t1 T1 
        INNER JOIN @relation Rel ON Rel.t1ID=T1.ID
        GROUP BY Rel.t2ID
)AS T1Sum ON  T1Sum.t2ID = T2.ID
INNER JOIN @t1 T1 ON T1Sum.t1ID=T1.ID

Результат:

T2ID   T2Name   Orders  T1ID    T1Name  Price     
 1      aaa       25     2       BBB    350,00     
 2      bbb       35     3       CCC    100,00

То, что мне нужно, прокомментировано выше, способ получить ROW_NUMBER, но также к Group Byв первую очередь. Поэтому мне нужно sumвсех цен T1-, сгруппированных по T2.IDв таблице отношений -и во внешнем запросе t1IDс самой высокой ценой.

Другими словами:Как изменить MAX(Rel.t1ID)AS t1IDтак, чтобы он частично возвращал идентификатор с самой высокой ценой?

Итак, желаемый результат: (обратите внимание, что первый T1ID изменился с 2 на 1, так как он имеет более высокую цену.):

T2ID   T2Name   Orders  T1ID    T1Name  Price     
 1      aaa       25     1       AAA    350,00     
 2      bbb       35     3       CCC    100,00

Примечание:на случай, если вам интересно, почему я не умножаю Ordersна цену. :они не реализованы(поэтому я должен был оставить этот столбец, так как он немного двусмысленный, пожалуйста, не обращайте на него внимания, я просто добавил его, чтобы сделать все менее абстрактным). На самом деле Ordersдолжен оставаться неизменным, это причина для подхода под-запроса к объединению обоих и причина, по которой мне нужно сгруппировать в первую очередь.

Заключение:очевидно, что на суть моего вопроса можно ответить с помощью пунктаOVER, который может быть применен к любой агрегатной функции, такой какSUM(см. ответ Дэмиена)то, что было для меня новым. Спасибо всем за ваши рабочие подходы.

31
задан Community 23 May 2017 в 12:34
поделиться