Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций / 25 сообщений из 96, страница 1 из 4
17.11.2020, 10:26
    #40019279
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
Доброго времени суток!

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

Простой lag предполагает знание точного количества строк, на которые поднимаешься. А как по значению? Или как правильно указать условие равенства дат?
...
Рейтинг: 0 / 0
17.11.2020, 10:38
    #40019285
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001,

Приведите пример данных в формате
Код: plsql
1.
with t as ( select ....

и образец желаемого результата.
...
Рейтинг: 0 / 0
17.11.2020, 10:39
    #40019286
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
Код: plsql
1.
first_value/last_value(case when ... end ignore nulls) over (order by ... range/rows between ...)
...
Рейтинг: 0 / 0
17.11.2020, 10:40
    #40019287
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
AmKad,

+ ignore nulls. Поправил предыдущее сообщение.
...
Рейтинг: 0 / 0
17.11.2020, 10:53
    #40019290
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
env,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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'.
...
Рейтинг: 0 / 0
17.11.2020, 10:54
    #40019291
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001,

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



значение st3 на передыдущие st1 дня относительно текущего st0
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  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
...
Рейтинг: 0 / 0
17.11.2020, 10:54
    #40019292
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
env,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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'.
вы даже сами не уверены?
...
Рейтинг: 0 / 0
17.11.2020, 10:57
    #40019294
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
andreymx,
это всего лишь пример. Мой реальный пример намного сложнее. Допустим - это значит один из возможных вариантов равенства. Считайте, что именно так.
...
Рейтинг: 0 / 0
17.11.2020, 11:05
    #40019298
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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
...
Рейтинг: 0 / 0
17.11.2020, 11:14
    #40019303
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
Stax,
что-то не то. Смещение в lag не должно равняться значению fld2. Или я чего-то не понимаю...
...
Рейтинг: 0 / 0
17.11.2020, 11:24
    #40019308
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
Stax,
что-то не то. Смещение в lag не должно равняться значению fld2. Или я чего-то не понимаю...


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

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

.....
stax
...
Рейтинг: 0 / 0
17.11.2020, 11:28
    #40019312
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
Stax,

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

Тут вероятно что-то типо: max() keep (dense_rank ...)
...
Рейтинг: 0 / 0
17.11.2020, 11:32
    #40019314
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001,

Вы задачу-то свою сформулируйте без "допустим" и "возможно". Пока что логика выбора строк не понятна.
...
Рейтинг: 0 / 0
17.11.2020, 11:33
    #40019317
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
Известно только то, что эта дата находится выше текущей

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

Приведите пример на десяток строк, ожидаемый результат и пояснение - "выбрана из строки N потому что..."
...
Рейтинг: 0 / 0
17.11.2020, 11:34
    #40019321
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
env,
читайте постом выше
...
Рейтинг: 0 / 0
17.11.2020, 11:34
    #40019322
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001,

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

.....
stax
...
Рейтинг: 0 / 0
17.11.2020, 11:36
    #40019323
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
env,
любая соответствующая значению, например sysdate. Объясняю смысл: ищется последняя дата предыдущего месяца и смотрится значение fld3 на эту дату. Найденное значение используется при расчете текущего значения fld2 по текущей дате.
...
Рейтинг: 0 / 0
17.11.2020, 11:41
    #40019327
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
ищется последняя дата предыдущего месяца

О, наконец-то конкретика пошла.
...
Рейтинг: 0 / 0
17.11.2020, 11:42
    #40019328
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
env,

я думал описанного выше хватит для понимания. А расчёт значения даты может быть любым.
...
Рейтинг: 0 / 0
17.11.2020, 11:43
    #40019329
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
env,

я думал описанного выше хватит для понимания.
А мы думали, тебе last_value/first_value хватит для понимания.
...
Рейтинг: 0 / 0
17.11.2020, 11:46
    #40019331
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
AmKad,
пример был универсальный. Если я не так выразился и не указал слово "константа" - это мой промах. Надеюсь теперь с условием проблем нет.
...
Рейтинг: 0 / 0
17.11.2020, 11:47
    #40019332
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001,

Так вам в ответ и дали универсальное решение )
...
Рейтинг: 0 / 0
17.11.2020, 11:49
    #40019334
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
Надеюсь теперь с условием проблем нет.
Лично я уже потерял интерес от необходимости собирать задачу по крупицам с каждого твоего поста. Надеюсь, энтузиазма Stax-а еще хватит.
...
Рейтинг: 0 / 0
17.11.2020, 11:56
    #40019335
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
Давайте ещё раз, чтобы не было вопросов по условию:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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).
...
Рейтинг: 0 / 0
17.11.2020, 12:00
    #40019339
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование оконных (аналитических) функций
ARRay001
В условии может быть несколько строк по дате '31.10.2020'.

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

Выдохните. Сформулируйте свою проблему максимально полно. У форумчан нет вашего контекста для восстановления лакун в описании.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование оконных (аналитических) функций / 25 сообщений из 96, страница 1 из 4
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]