Это немного меньше, если вы используете функции. Оконные
select shippers_ranked.OrderYear as OrderYear,
shippers_ranked.ShipperId as ShipperId,
shippers_ranked.TotalFreight as TotalFreight
from
(
select shippers_freight.*, row_number() over (partition by shippers_freight.OrderYear order by shippers_freight.TotalFreight desc) as Ranking
from
(
select year(OrderDate) as OrderYear,
s.ShipperID as ShipperId,
sum(freight) as TotalFreight
from orders o
inner join shippers s on o.ShipVia = s.ShipperID
group by year(OrderDate), s.ShipperID
) shippers_freight
) shippers_ranked
where shippers_ranked.Ranking = 1
order by shippers_ranked.OrderYear
;
Вы должны решить, что вы хотели бы произойти, если два грузоотправители имеют один и тот же TotalFreight в течение года - как код выше стоит, вы получите одну строку (недетерминированно). Если вам нужна одна строка, я бы добавил ShipperId в order by
в предложении over()
, чтобы вы всегда получали одну и ту же строку. Если в том же случае TotalFreight вы хотели бы вернуть несколько строк, используйте dense_rank()
, а не row_number()
.
Попробуйте объяснить с дополнительной информацией, как вы можете, это поможет нам получить вас .. –
Это может помочь, если вы публикуете, как вам нужны ожидаемые результаты – Kane
1-й столбец: год (список) 2-я колонка: shipperID (тот, который имеет самую высокую стоимость в этом году) и 3-й столбец: общая стоимость этого грузоотправителя в этом году. – user3163154