Вроде бы простая выборка, а что-то торможу (Oracle)
От: Аноним  
Дата: 08.04.08 08:42
Оценка:
Привет, пытаюсь выполнить простой запрос, а что-то никак не получается...

Имеем таблицу со следующими полями:
create table ags_tmp
(
  f_1 integer, -- месяц
  f_2 integer, -- подразделение
  f_3 integer  -- фонд заработной платы
);
/


Вносим данные:
insert into ags_tmp values (1, 1, 100);
insert into ags_tmp values (1, 2, 150);
insert into ags_tmp values (2, 1, 130);
insert into ags_tmp values (2, 2, 100);


Необходимо узнать в каком месяце, какое подразделение имело максимальный фонд заработной платы (т.е. запись №2 и №3).
Т.е. те записи, которые мне нужны я могу получить выборкой:

select f_1, max(f_3) 
  from ags_tmp
  group by f_1;


Данный запрос возвращает мне максимальный заработный фонд за определенный месяц. Но мне еще нужно знать какое подразделение имело данный заработный фонд. Выборка:

select f_1, f_2, max(f_3) 
  from ags_tmp
  group by f_1, f_2;


естественно возвращает мне уже 4 записи...

Так как мне выбрать максимальный заработный фонд, номер подразделения по месяцам?
Re: Вроде бы простая выборка, а что-то торможу (Oracle)
От: Аноним  
Дата: 08.04.08 09:30
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Так как мне выбрать максимальный заработный фонд, номер подразделения по месяцам?


SELECT tt.f_1, tt.f_2, tt.f_3
  FROM (SELECT f_1, f_2, f_3, MAX (f_3) OVER (PARTITION BY f_1) AS ms
          FROM ags_tmp) tt
 WHERE tt.f_3 = tt.ms


SELECT tmp.f_1, tmp.f_2, tmp.f_3
  FROM ags_tmp tmp,
       (SELECT   f_1, MAX (f_3) AS ms
            FROM ags_tmp
        GROUP BY f_1) t
 WHERE tmp.f_3 = t.ms
Re[2]: Вроде бы простая выборка, а что-то торможу (Oracle)
От: oracle-novice  
Дата: 09.04.08 04:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Так как мне выбрать максимальный заработный фонд, номер подразделения по месяцам?


А>
А>SELECT tt.f_1, tt.f_2, tt.f_3
А>  FROM (SELECT f_1, f_2, f_3, MAX (f_3) OVER (PARTITION BY f_1) AS ms
А>          FROM ags_tmp) tt
А> WHERE tt.f_3 = tt.ms
А>


А>
А>SELECT tmp.f_1, tmp.f_2, tmp.f_3
А>  FROM ags_tmp tmp,
А>       (SELECT   f_1, MAX (f_3) AS ms
А>            FROM ags_tmp
А>        GROUP BY f_1) t
А> WHERE tmp.f_3 = t.ms
А>



Спасибо! Нужно почитать про аналитические функции...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.