минимальная статья в группе и аналитика

Alexus12
Дата: 28.02.2007 11:17:08
есть результат соединения двух таблиц:

SELECT id_list, f_customer_number, t_lists.id_par, p, p_order
  FROM scott.t_lists, scott.t_listpars
  WHERE scott.t_lists.id_par= scott.t_listpars.id_par
  order by f_customer_number, p_order

id_list	f_customer_number	 t_lists.id_par	 p	 p_order
1	50001				1	Par1     5
1	50001				2	Par2     7
1	50001				3	Par3	 9
1	50001				4	Par4     21
1	50002				12	Par12    3
1	50002				13	Par13    4
1	50002				10	Par10    26
1	50002				11	Par11    35
1	50003				2	Par2     7
1	50003				5	Par5     8
1	50003				3	Par3     9
1	50003				4	Par4     21
нужно для каждой комбинации id_list,f_customer_number
выбрать р, соответсвующий минимальному p_order, то есть получить:

id_list	f_customer_number	 t_lists.id_par	 p	 p_order
1	50001				1	Par1     5
1	50002				12	Par12    3
1	50003				2	Par2     7

через MIN() умею, а можно аналитической функцией? можете пример?
Бабичев Сергей
Дата: 28.02.2007 11:19:41
Тынц, если что
Jannny
Дата: 28.02.2007 11:19:56
Alexus12
через MIN() умею, а можно аналитической функцией?
А зачем аналитической, если здесь dense rank напрашивается??
dmidek
Дата: 28.02.2007 11:22:52
Jannny
Alexus12
через MIN() умею, а можно аналитической функцией?
А зачем аналитической, если здесь dense rank напрашивается??


Вы наверное про FIRST/LAST ?
Бабичев Сергей
Дата: 28.02.2007 11:26:28
dmidek
Jannny
Alexus12
через MIN() умею, а можно аналитической функцией?
А зачем аналитической, если здесь dense rank напрашивается??


Вы наверное про FIRST/LAST ?
Ну а куда же агрегатному FIRST/LAST без DENSE_RANK?
dmidek
Дата: 28.02.2007 11:43:52
Бабичев Сергей
dmidek
Jannny
Alexus12
через MIN() умею, а можно аналитической функцией?
А зачем аналитической, если здесь dense rank напрашивается??


Вы наверное про FIRST/LAST ?
Ну а куда же агрегатному FIRST/LAST без DENSE_RANK?


Ключевое слово DENSE_RANK не является признаком агрегата, а вне контекста
употребляется именно для обозначения соответствующей аналитической функции.

Именно на это я и с улыбкой (так как она это и так прекрасно знает) ,
обратил внимание Jannny.
Alexus12
Дата: 28.02.2007 11:48:08
спасибо, вот так правильно?

SELECT * FROM (
SELECT id_list, f_customer_number, t_lists.id_par, p, p_order,
DENSE_RANK() OVER (PARTITION BY id_list,f_customer_number ORDER BY p_order) as drank
  FROM scott.t_lists, scott.t_listpars
  WHERE scott.t_lists.id_par= scott.t_listpars.id_par
) where drank=1
Бабичев Сергей
Дата: 28.02.2007 11:51:06
Alexus12
спасибо, вот так правильно?

SELECT * FROM (
SELECT id_list, f_customer_number, t_lists.id_par, p, p_order,
DENSE_RANK() OVER (PARTITION BY id_list,f_customer_number ORDER BY p_order) as drank
  FROM scott.t_lists, scott.t_listpars
  WHERE scott.t_lists.id_par= scott.t_listpars.id_par
) where drank=1
Всё зависит от того, как должны отрабатываться записи с одинаково минимальной статьей в группе.
Если должны браться все записи с одинаково минимальной статьей внутри группы, то правильно. А если всего лишь одна из всех подходящих - то лучше заменить DENSE_RANK на ROW_NUMBER
Alexus12
Дата: 28.02.2007 12:06:09
спасибо, у меня уникальны тройки id_list,f_customer_number, p_order

а это единственное различие DENSE_RANK и ROW_NUMBER?

а в чем отличия FIRST_VALUE? и как применять его?
Бабичев Сергей
Дата: 28.02.2007 12:11:09
Alexus12
спасибо, у меня уникальны тройки id_list,f_customer_number, p_order

а это единственное различие DENSE_RANK и ROW_NUMBER?

а в чем отличия FIRST_VALUE? и как применять его?
Тебе предлагалось использовать не аналитическую FIRST_VALUE / LAST_VALUE, а агрегатную FIRST или LAST
min(<field_name>) keep (dense_rank first order by <field_name>)