Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 |
|
|
 |
|