Необходимо СУММИТЬ обороты по part_name, затем ВЫБЕРИТЕ МАКС - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть таблица с сегментом, part_name, оборотов, как таковая:

segment      part_name  cust_id    turnover
A            blue       1           4202  
A            red        1           625342
A            blue       9           369
B            orange     6           31323 
B            orange     8           4678
B            red        8           27847 
C            red        3           13001 
C            blue       4           3097
C            blue       5           423
C            blue       2           9753 

Я пробовал довольно много внутренних объединений, которые не работали, и после троллинга в Интернете некоторое время отвечал,решил обратиться к SO

, фактический результат должен составлять только 3 строки (по одной на сегмент) с именем part_name, которое имеет сумму максимального оборота (обороты должны быть добавлены по part_name, а затем по имени частис наибольшей суммой оборота необходимо вернуть - НЕ ТОЛЬКО максимальный оборот в строке, а СУММУ оборота по part_name)

A    red             625342 
B    orange          36001 
C    blue            13273 

СПАСИБО.

1 Ответ

2 голосов
/ 23 апреля 2019

Вы хотите row_number():

select t.*
from (select t.*, row_number() over (partition by segment order by turnover desc) as seq
      from table t
     ) t
where seq = 1;

Если у вас есть связь с turnover, тогда используйте dense_rank().

РЕДАКТИРОВАТЬ: Я неправильно прочитал вопрос о функции окна с row_number()

select t.segment, t.part_name, t.t_turnover as turnover
from (select t.*, row_number() over (partition by segment order by t_turnover desc) as seq
      from (select t.*, sum(turnover) over (partition by segment, part_name) as t_turnover 
            from table t
           ) t
     ) t
where seq = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...