Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
Доброго времени суток!

Подскажите, как с помощью оконных (аналитических) функций найти значение нужного столбца по значению другого.
Пример: select формирует таблицу, где в первом столбце идут даты (st0), в остальных (st1, st2, st3...) какие-то значения.
Надо с текущей позиции select найти значение st3, соответствующее определенной дате, находящейся выше текущей на неопределенное количество строк, т.е. по значению даты.

Простой lag предполагает знание точного количества строк, на которые поднимаешься. А как по значению? Или как правильно указать условие равенства дат?
17 ноя 20, 10:26    [22233527]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
ARRay001,

Приведите пример данных в формате
with t as ( select ....
и образец желаемого результата.
17 ноя 20, 10:38    [22233537]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
AmKad
Member

Откуда:
Сообщений: 5222
first_value/last_value(case when ... end ignore nulls) over (order by ... range/rows between ...)


Сообщение было отредактировано: 17 ноя 20, 10:35
17 ноя 20, 10:39    [22233538]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
AmKad
Member

Откуда:
Сообщений: 5222
AmKad,

+ ignore nulls. Поправил предыдущее сообщение.

Сообщение было отредактировано: 17 ноя 20, 10:35
17 ноя 20, 10:40    [22233539]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
env,

with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('10.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('11.10.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('12.10.2020', 'DD.MM.YYYY'), 30, '43' from dual
    
)
select t1.*
from t1;


Результат: В строке с датой '12.10.2020' надо, допустим, значение fld2 сделать равным значению fld3 на у даты '10.10.2020'.

Сообщение было отредактировано: 17 ноя 20, 10:49
17 ноя 20, 10:53    [22233542]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2798
ARRay001,

окно в три строки и окно в три дня ето разные окнa



значение st3 на передыдущие st1 дня относительно текущего st0
  1  with t as (
  2  select date '2020-01-01' st0, 1 st1,101 st3 from dual union all
  3  select date '2020-01-02' st0, 1 st1,102 st3 from dual union all
  4  select date '2020-01-03' st0, 2 st1,103 st3 from dual union all
  5  select date '2020-01-04' st0, 2 st1,104 st3 from dual union all
  6  select date '2020-01-10' st0, 7 st1,105 st3 from dual union all
  7  select date '2020-01-11' st0, 6 st1,106 st3 from dual union all
  8  select date '2020-01-12' st0, 2 st1,107 st3 from dual)
  9  select
 10   t.*
 11  ,first_value(st3) over (order by st0 range st1 preceding) f
 12* from t
SQL> /

ST0               ST1        ST3          F
---------- ---------- ---------- ----------
01.01.2020          1        101        101
02.01.2020          1        102        101
03.01.2020          2        103        101
04.01.2020          2        104        102
10.01.2020          7        105        103
11.01.2020          6        106        105
12.01.2020          2        107        105

7 rows selected.



......
stax
17 ноя 20, 10:54    [22233543]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54398
ARRay001
env,

with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('10.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('11.10.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('12.10.2020', 'DD.MM.YYYY'), 30, '43' from dual
    
)
select t1.*
from t1;



Результат: В строке с датой '12.10.2020' надо, допустим, значение fld2 сделать равным значение fld3 на у даты '10.10.2020'.
вы даже сами не уверены?
17 ноя 20, 10:54    [22233544]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
andreymx,
это всего лишь пример. Мой реальный пример намного сложнее. Допустим - это значит один из возможных вариантов равенства. Считайте, что именно так.
17 ноя 20, 10:57    [22233546]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2798
ARRay001,

SQL> ed
Wrote file afiedt.buf

  1  with t1 (id, date1, fld2, fld3) as
  2  (
  3                select 111, to_date('10.10.2020', 'DD.MM.YYYY'), 1, '11' from dual
  4      union all select 222, to_date('11.10.2020', 'DD.MM.YYYY'), 2, '22' from dual
  5      union all select 333, to_date('12.10.2020', 'DD.MM.YYYY'), 2, '43' from dual
  6      union all select 444, to_date('13.10.2020', 'DD.MM.YYYY'), 3, '55' from dual
  7      union all select 555, to_date('14.10.2020', 'DD.MM.YYYY'), 2, '77' from dual
  8      union all select 777, to_date('15.10.2020', 'DD.MM.YYYY'), 4, '88' from dual
  9  )
 10  select t1.*
 11  ,lag(fld3,fld2) over (order by date1) l
 12* from t1
SQL> /

        ID DATE1            FLD2 FL L
---------- ---------- ---------- -- --
       111 10.10.2020          1 11
       222 11.10.2020          2 22
       333 12.10.2020          2 43 11
       444 13.10.2020          3 55 11
       555 14.10.2020          2 77 43
       777 15.10.2020          4 88 22

6 rows selected.

SQL>


.....
stax
17 ноя 20, 11:05    [22233550]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
Stax,
что-то не то. Смещение в lag не должно равняться значению fld2. Или я чего-то не понимаю...
17 ноя 20, 11:14    [22233556]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2798
ARRay001
Stax,
что-то не то. Смещение в lag не должно равняться значению fld2. Или я чего-то не понимаю...


ето я не понимаю что Вам надо

смещение (в строках!) задается в столбце fld2

.....
stax
17 ноя 20, 11:24    [22233561]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
Stax,

оно нигде не задается. Есть таблица с полями fld0(с датами), fld1(со значениями 1), fld2(со значениями 2), fld3(со значениями 3).
Надо каждое значение fld2 поменять на значение fld3, соответствующее конкретной дате (в примере это '10.10.2020') - конкретное смещение не известно. Известно только то, что эта дата находится выше текущей (на которой курсор select).

Тут вероятно что-то типо: max() keep (dense_rank ...)

Сообщение было отредактировано: 17 ноя 20, 11:26
17 ноя 20, 11:28    [22233567]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
ARRay001,

Вы задачу-то свою сформулируйте без "допустим" и "возможно". Пока что логика выбора строк не понятна.
17 ноя 20, 11:32    [22233569]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
ARRay001
Известно только то, что эта дата находится выше текущей

Любая дата выше текущей? Критерии внятно пропишите, без этого решать нечего.

Приведите пример на десяток строк, ожидаемый результат и пояснение - "выбрана из строки N потому что..."

Сообщение было отредактировано: 17 ноя 20, 11:29
17 ноя 20, 11:33    [22233572]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
env,
читайте постом выше
17 ноя 20, 11:34    [22233576]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2798
ARRay001,

откуда берется 10.10.2020? параметр?

.....
stax
17 ноя 20, 11:34    [22233577]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
env,
любая соответствующая значению, например sysdate. Объясняю смысл: ищется последняя дата предыдущего месяца и смотрится значение fld3 на эту дату. Найденное значение используется при расчете текущего значения fld2 по текущей дате.
17 ноя 20, 11:36    [22233578]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
ARRay001
ищется последняя дата предыдущего месяца

О, наконец-то конкретика пошла.
17 ноя 20, 11:41    [22233585]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
env,

я думал описанного выше хватит для понимания. А расчёт значения даты может быть любым.
17 ноя 20, 11:42    [22233586]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
AmKad
Member

Откуда:
Сообщений: 5222
ARRay001
env,

я думал описанного выше хватит для понимания.
А мы думали, тебе last_value/first_value хватит для понимания.
17 ноя 20, 11:43    [22233587]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
AmKad,
пример был универсальный. Если я не так выразился и не указал слово "константа" - это мой промах. Надеюсь теперь с условием проблем нет.

Сообщение было отредактировано: 17 ноя 20, 11:41
17 ноя 20, 11:46    [22233590]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
ARRay001,

Так вам в ответ и дали универсальное решение )
17 ноя 20, 11:47    [22233592]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
AmKad
Member

Откуда:
Сообщений: 5222
ARRay001
Надеюсь теперь с условием проблем нет.
Лично я уже потерял интерес от необходимости собирать задачу по крупицам с каждого твоего поста. Надеюсь, энтузиазма Stax-а еще хватит.
17 ноя 20, 11:49    [22233594]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
ARRay001
Member

Откуда:
Сообщений: 50
Давайте ещё раз, чтобы не было вопросов по условию:

with t1 (id, date1, fld2, fld3) as
(
              select 111, to_date('31.10.2020', 'DD.MM.YYYY'), 10, '11' from dual
    union all select 222, to_date('01.11.2020', 'DD.MM.YYYY'), 15, '22' from dual
    union all select 333, to_date('05.11.2020', 'DD.MM.YYYY'), 30, '43' from dual
    
)
select t1.*
from t1;


Что надо найти: Значение fld3 на последний день предыдущего месяца. Т.е. для строки с датой '05.11.2020' это значение будет равно '11'. В условии может быть несколько строк по дате '31.10.2020' - в таком случае берётся последняя в сортировке (сортировать можно по id).

Сообщение было отредактировано: 17 ноя 20, 11:58
17 ноя 20, 11:56    [22233599]     Ответить | Цитировать Сообщить модератору
 Re: Использование оконных (аналитических) функций  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
ARRay001
В условии может быть несколько строк по дате '31.10.2020'.

Да что ж из вас клещами всё тянуть-то надо. И какую из них тогда брать?

Выдохните. Сформулируйте свою проблему максимально полно. У форумчан нет вашего контекста для восстановления лакун в описании.
17 ноя 20, 12:00    [22233604]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Oracle Ответить