Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Переписать на аналитические функции  [new]
alex_karmeev
Member

Откуда:
Сообщений: 4
Доброго времени суток! имеется представление, каждое поле которого состоит из запроса, возвращающего последнее значение на дату. Необходимо переделать на аналитику
вот фрагмент
(SELECT DISTINCT d_nnom
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = 450
AND p_ves1mes_br IS NULL
AND d_ddoc =
(SELECT MAX (d_ddoc)
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = 450
AND p_ves1mes_br IS NULL
AND d_ddoc <= '31.01.2011'))
30 мар 11, 09:02    [10443202]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
Аналитик2
Guest
alex_karmeev,

max(d_ddoc) over(partition by d_invnom)
30 мар 11, 09:13    [10443241]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
Аналитик2
Guest
А вообще, было бы неплохо привести весь запрос и более развернуто объяснить суть вопроса
30 мар 11, 09:15    [10443248]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
alex_karmeev
Member

Откуда:
Сообщений: 4
Аналитик2,

Вот это представление. Только полей пару десятков, но все аналогично достаются. То есть при подаче данных должна быть возвращена всегда одна строка с последними изменениями. Например, может быть несколько документов, которые меняют состояние поля d_nnom (01.03.2011 - значение=1, 03.03.2011 - значение=2, 05.03.2011 - значение=3).
При подаче даты='04.03.2011' запрос должен возвращать значение=2. Причины необходимости перевода на аналитику - много кода, долго работает.
SELECT
b.d_invnom, b.d_nnom, b.d_dtshet,
dat
FROM (SELECT a.d_invnom, dat,
(SELECT DISTINCT d_nnom
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = a.d_invnom
AND p_ves1mes_br IS NULL
AND d_ddoc =
(SELECT MAX (d_ddoc)
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = a.d_invnom
AND p_ves1mes_br IS NULL
AND d_ddoc <= dat)) d_nnom,
-- *** Номенкл.номер */
(SELECT DISTINCT d_dtshet
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_invnom = a.d_invnom
AND ( d_dtshet LIKE '241%'
OR d_dtshet LIKE '231%'
OR d_dtshet LIKE '0011%'
OR d_dtshet LIKE '0001%'
)
AND NOT (d_tdoc='02999' AND d_txo='00005')
AND d_ddoc =
(SELECT MAX (d_ddoc)
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_invnom = a.d_invnom
AND ( d_dtshet LIKE '241%'
OR d_dtshet LIKE '231%'
OR d_dtshet LIKE '0011%'
OR d_dtshet LIKE '0001%'
)
AND NOT (d_tdoc='02999' AND d_txo='00005')
AND d_ddoc <= dat)) d_dtshet --***Счет-
FROM (SELECT d_invnom, dat
FROM azhs.mcfo_os, azhs.wv_dats
WHERE d_bux_prov = '1'
AND d_tdoc IN ('02101', '02104', '02106', '02109')
AND d_ddoc <= dat)a) b;
30 мар 11, 10:00    [10443437]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
Аналитик2
Guest
SELECT a.d_invnom,
       dat,
       (SELECT max(distinct decode(d_ddoc,
                          max(d_ddoc) over(partition by d_invnom),
                          d_nnom))
          FROM azhs.mcfo_os
         WHERE d_bux_prov = 1
           AND d_nnom IS NOT NULL
           AND d_invnom = a.d_invnom
           AND p_ves1mes_br IS NULL
           AND d_ddoc <= dat) d_nnom,

...
  FROM (SELECT d_invnom, dat
          FROM azhs.mcfo_os, azhs.wv_dats
         WHERE d_bux_prov = '1'
           AND d_tdoc IN ('02101', '02104', '02106', '02109')
           AND d_ddoc <= dat) a;

Если конечно на одну дату не может быть несколько d_nnom при
WHERE d_bux_prov = 1
    AND d_nnom IS NOT NULL
    AND d_invnom = a.d_invnom
    AND p_ves1mes_br IS NULL
           AND d_ddoc <= dat
30 мар 11, 12:35    [10444644]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
alex_karmeev
Member

Откуда:
Сообщений: 4
Как раз таки могут быть в одну дату несколько d_nnom, но при условии что они с одинаковым значением.

SELECT distinct last_value(d_nnom) over (order by d_ddoc rows between unbounded preceding and unbounded following)
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = 450
AND p_ves1mes_br IS NULL
AND d_ddoc <= '31.12.2010'

что-то такое должно быть, но смущает distinct
30 мар 11, 13:45    [10445256]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
taranezzz
Member

Откуда:
Сообщений: 42

SELECT DISTINCT d_nnom
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = a.d_invnom
AND p_ves1mes_br IS NULL
AND d_ddoc = (SELECT MAX (d_ddoc)
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = a.d_invnom
AND p_ves1mes_br IS NULL
AND d_ddoc <= dat)

Надо избавиться в подзапросах от
d_ddoc = (SELECT MAX (d_ddoc)
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND d_invnom = a.d_invnom
AND p_ves1mes_br IS NULL
AND d_ddoc <= dat)
и от
DISTINCT d_nnom
вот такая суть вопроса насколько я понял. т.к. основная задача сделать запрос быстрее
30 мар 11, 14:00    [10445408]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
Аналитик2
Guest
alex_karmeev
при условии что они с одинаковым значением


Тогда проверяйте на своих данных мой вариант
30 мар 11, 14:03    [10445446]     Ответить | Цитировать Сообщить модератору
 Re: Переписать на аналитические функции  [new]
alex_karmeev
Member

Откуда:
Сообщений: 4
Решил вот таким образом

(SELECT d_nnom FROM
(SELECT DISTINCT d_nnom, d_ddoc, d_invnom, max(d_ddoc) over (partition by d_invnom) max_dat
FROM azhs.mcfo_os
WHERE d_bux_prov = 1
AND d_nnom IS NOT NULL
AND p_ves1mes_br IS NULL )
where d_ddoc = max_dat
and d_ddoc <= dat
and d_invnom = a.d_invnom) d_nnom
4 апр 11, 14:32    [10467788]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить