| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		storysoft Участник со стажем
 
  Вступление в Клуб: 18.07.2014
  | 
		
			
				 Ср Июн 01, 2016 10:32   Аналитика в pl+ | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Добрый день коллеги. Подскажите как в pl+ перевести такую конструкцию:
 
 
DTIME-lag(DTIME) OVER(ORDER BY DTIME)
 
 
В pl+ ругается на первый аргумент, где выражение (Неправильный тип выражения).
 
 
 
 	  | Код: | 	 		  | analytic(ows1.[TRANS_DTIME]-lag(ows1.[TRANS_DTIME]), 'OVER(order by [1])',ows1.[TRANS_DTIME]) | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		yaffil Профи
 
  Вступление в Клуб: 18.08.2011
  | 
		
			
				 Ср Июн 01, 2016 10:35    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Групповые функции:
 
        CORR
 
        COVAR_POP
 
        COVAR_SAMP
 
        REGR_XXX (XXX=/SLOPE INTERCEPT COUNT R2 AVGX AVGY SXX SYY SYY/)
 
        STDDEV_POP
 
        STDDEV_SAMP
 
        VAR_POP
 
        VAR_SAMP
 
Аналитические функции:
 
	LISTAGG
 
        CUME_DIST
 
        DENSE_RANK
 
        PERCENT_RANK
 
        RANK
 
        FIRST_VALUE
 
        LAST_VALUE
 
        LAG
 
        LEAD
 
        NTILE
 
        RATIO_TO_REPORT
 
        ROW_NUMBER
 
        PERCENTILE_CONT (Oracle9i)
 
        PERCENTILE_DISC (Oracle9i)
 
Для вызова аналитических функций и групповых в режиме аналитических
 
добавлена специальная псевдо-функция ANALYTIC. Формат ее вызова:
 
        ANALYTIC(group_func(params),template,expr1,expr2,...)
 
где
 
    group_func - вызов групповой или аналитической функции из указанных выше,
 
    params - собственный набор параметров функции group_func,
 
    template - строковая константа, определяющая опции вызова аналитической
 
               функции (over_clause, query_partition_clause, order_by_clause,
 
               windowing clause,within_group_clause,keep_clause) в формате
 
               Oracle SQL, содержащая place_holders для выражений, используемых
 
               в этих опциях, в виде [<порядковый номер>]
 
    expr1,expr2,... - выражения, которыми заменяются place_holders в шаблоне
 
               опций аналитической функции (template). Причем выражение
 
               expr1 заменяет все вхождения подстроки '[1]' в указанном
 
               шаблоне, expr2 заменяет вхождения '[2]' и т.д. | 
			 
		  | 
	
	
		  | 
	
	
		storysoft Участник со стажем
 
  Вступление в Клуб: 18.07.2014
  | 
		
			
				 Ср Июн 01, 2016 10:42    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				group_func - вызов групповой или аналитической функции из указанных выше
 
 
Как быть если нужно подать выражение (DTIME-lag(DTIME)) в group_func?
 
В pl/sql DTIME-lag(DTIME) OVER(ORDER BY DTIME) компилируется без проблем. | 
			 
		  | 
	
	
		  | 
	
	
		Volod Эксперт
 
  Вступление в Клуб: 19.09.2007
  | 
		
			
				 Ср Июн 01, 2016 11:03    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				DTIME-analytic(lag([1]), 'OVER(ORDER BY [1])', DTIME)
 
 
А что такое DTIME? Колонка? А где алиас? | 
			 
		  | 
	
	
		  | 
	
	
		storysoft Участник со стажем
 
  Вступление в Клуб: 18.07.2014
  | 
		
			
				 Ср Июн 01, 2016 11:15    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Код: | 	 		  
 
select ows1(
 
    analytic(ows1.[TRANS_DTIME]-lag(ows1.[TRANS_DTIME]), 'OVER(order by [1])',ows1.[TRANS_DTIME]) : ttt
 
)
 
in ::[OWS_TRANSACTION] all
 
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		Amper Профи
 
  Вступление в Клуб: 29.10.2010
  | 
		
			
				 Ср Июн 01, 2016 11:22    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Так:
 
 	  | Код: | 	 		  select ows1(
 
   ows1.[TRANS_DTIME] - analytic(lag(ows1.[TRANS_DTIME]), 'OVER(order by [1])',ows1.[TRANS_DTIME]) : ttt
 
)
 
in ::[OWS_TRANSACTION] all | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		storysoft Участник со стажем
 
  Вступление в Клуб: 18.07.2014
  | 
		
			
				 Ср Июн 01, 2016 12:47    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Всем спасибо, скомпилировалось | 
			 
		  | 
	
	
		  | 
	
	
		storysoft Участник со стажем
 
  Вступление в Клуб: 18.07.2014
  | 
		
			
				 Чт Июн 02, 2016 06:59    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Подскажите еще вопрос как в PL+ использовать в условии where вычисляемые поля? Например в pl/sql такой запрос компилируются а в pl+ ошибка "нет реквизита или операции dt_prev"
 
 	  | Код: | 	 		  
 
select ows1(
 
               analytic(lag(ows1.[TRANS_DTIME]), 'OVER(order by [1])',ows1.[TRANS_DTIME]) : dt_prev
 
            )
 
         in ::[OWS_TRANSACTION] all
 
         where dt_prev - ows1.[TRANS_DTIME] <= mins
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		Эмиралька Эксперт
 
  Вступление в Клуб: 09.11.2015
  | 
		
			
				 Чт Июн 02, 2016 08:25    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | storysoft пишет: | 	 		  Подскажите еще вопрос как в PL+ использовать в условии where вычисляемые поля? Например в pl/sql такой запрос компилируются а в pl+ ошибка "нет реквизита или операции dt_prev"
 
 	  | Код: | 	 		  
 
select ows1(
 
               analytic(lag(ows1.[TRANS_DTIME]), 'OVER(order by [1])',ows1.[TRANS_DTIME]) : dt_prev
 
            )
 
         in ::[OWS_TRANSACTION] all
 
         where dt_prev - ows1.[TRANS_DTIME] <= mins
 
 | 	 
  | 	  
 
 
Что-то у меня сомнения.
 
Как в условии where можно обратиться к полям, которые определяются после того, как должно отработать where ?
 
А напиши SQL-запрос, который сработает?
 
Заинтересовало. | 
			 
		  | 
	
	
		  | 
	
	
		Volod Эксперт
 
  Вступление в Клуб: 19.09.2007
  | 
		
			
				 Чт Июн 02, 2016 09:09    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Код: | 	 		  select  x(x.dt_prev :dt_prev) in (select ... :dt_prev......)
 
where x.dt_prev .... | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		storysoft Участник со стажем
 
  Вступление в Клуб: 18.07.2014
  | 
		
			
				 Чт Июн 02, 2016 13:10    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Прошу прощения погорячился, надо подзапрос делать | 
			 
		  | 
	
	
		  | 
	
	
		Эмиралька Эксперт
 
  Вступление в Клуб: 09.11.2015
  | 
		
			
				 Чт Июн 02, 2016 13:34    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | storysoft пишет: | 	 		  | Прошу прощения погорячился, надо подзапрос делать | 	  
 
 
Нууу, так не интересно.
 
А вот зато в order by в SQL можно обращаться к полям запроса:
 
 	  | Код: | 	 		  select c_main_v_id
 
, substr(c_main_v_id, 6, 3) c_iso
 
 from z#ac_fin
 
order by c_iso | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		 |