powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / нахождение максимальной разницы между записями
10 сообщений из 10, страница 1 из 1
нахождение максимальной разницы между записями
    #39494144
tenmonan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!

Подскажите плиз как можно вытащить максимальную разницу между записями в таб. по типу ниже?
Требуется, например, вернуть для id = 193 следующие даты 01.09.2014 и 01.01.2017, и для id = 269 даты - 01.01.2014 и 01.09.2016.
Думаю, это можно сделать через циклы.
ID M ost
193 01.07.2014 50000
193 01.08.2014 6000
193 01.09.2014 700000
193 01.01.2017 3301,57
193 01.04.2017 0
269 01.12.2013 9274,666667
269 01.01.2014 23183,92
269 01.09.2016 22883,92
269 01.11.2016 12100
269 01.12.2016 3546
269 01.01.2017 21983,92
269 01.03.2017 0
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39494157
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без циклов, одним запросом. Почитайте про аналитические функции:
https://docs.oracle.com/cloud/latest/db112/SQLRF/functions004.htm

Конкретно есть функция lag.
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39494480
Азагаш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tenmonan,
что-то я не понял, как для id = 269 разница между 01.01.2014 и 01.09.2016, равная 300, вдруг стала больше разницы между 01.01.2017 и 01.03.2017, которая равна 21983,92?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with src as ( select 193 i, to_date('01.07.2014','dd.mm.yyyy') d, 50000 v from dual union
              select 193 i, to_date('01.08.2014','dd.mm.yyyy') d, 6000 v from dual union
              select 193 i, to_date('01.09.2014','dd.mm.yyyy') d, 700000 v from dual union
              select 193 i, to_date('01.01.2017','dd.mm.yyyy') d, 3301.57 v from dual union
              select 193 i, to_date('01.04.2017','dd.mm.yyyy') d, 0 v from dual union
              select 269 i, to_date('01.12.2013','dd.mm.yyyy') d, 9274.666667 v from dual union
              select 269 i, to_date('01.01.2014','dd.mm.yyyy') d, 23183.92 v from dual union
              select 269 i, to_date('01.09.2016','dd.mm.yyyy') d, 22883.92 v from dual union
              select 269 i, to_date('01.11.2016','dd.mm.yyyy') d, 12100 v from dual union
              select 269 i, to_date('01.12.2016','dd.mm.yyyy') d, 3546 v from dual union
              select 269 i, to_date('01.01.2017','dd.mm.yyyy') d, 21983.92 v from dual union
              select 269 i, to_date('01.03.2017','dd.mm.yyyy') d, 0 v from dual ),
     ord as ( select row_number() over ( partition by s.i order by s.d ) n, s.* from src s ),         
     dif as ( select o1.n n1, o1.i i1, o1.d d1, o1.v v1, 
                     o2.n n2, o2.i i2, o2.d d2, o2.v v2, 
                     abs(o1.v - o2.v) f,
                     row_number() over ( partition by o1.i order by abs(o1.v - o2.v) desc ) k
              from ord o1 inner join ord o2 on ( o2.i = o1.i and o2.n = o1.n+1 ) )
select *
from dif f
where f.k = 1  
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39494510
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tenmonan,

20670977

Код: 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.
30.
31.
32.
  1  with t    as ( select 193 i, to_date('01.07.2014','dd.mm.yyyy') d, 50000 v from dual union
  2                select 193 i, to_date('01.08.2014','dd.mm.yyyy') d, 6000 v from dual union
  3                select 193 i, to_date('01.09.2014','dd.mm.yyyy') d, 700000 v from dual union
  4                select 193 i, to_date('01.01.2017','dd.mm.yyyy') d, 3301.57 v from dual union
  5                select 193 i, to_date('01.04.2017','dd.mm.yyyy') d, 0 v from dual union
  6                select 269 i, to_date('01.12.2013','dd.mm.yyyy') d, 9274.666667 v from dual union
  7                select 269 i, to_date('01.01.2014','dd.mm.yyyy') d, 23183.92 v from dual union
  8                select 269 i, to_date('01.09.2016','dd.mm.yyyy') d, 22883.92 v from dual union
  9                select 269 i, to_date('01.11.2016','dd.mm.yyyy') d, 12100 v from dual union
 10                select 269 i, to_date('01.12.2016','dd.mm.yyyy') d, 3546 v from dual union
 11                select 269 i, to_date('01.01.2017','dd.mm.yyyy') d, 21983.92 v from dual union
 12                select 269 i, to_date('01.03.2017','dd.mm.yyyy') d, 0 v from dual )
 13  ,tt as
 14  (select t.*
 15    ,abs(lag(v) over(partition by i order by d)-v) delta
 16    ,lag(d) over(partition by i order by d) l_d
 17   from t
 18  )
 19  select
 20    i
 21   ,max(delta) max_delta
 22   ,max(l_d) KEEP (DENSE_RANK LAST ORDER BY delta) d1
 23   ,max(d) KEEP (DENSE_RANK LAST ORDER BY delta) d2
 24  from tt
 25  where l_d is not null
 26* group by i
SQL> /

         I  MAX_DELTA D1       D2
---------- ---------- -------- --------
       193  696698,43 01.09.14 01.01.17
       269   21983,92 01.01.17 01.03.17
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39494512
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Азагаш,

tenmonan зачем-то прописал поле ost которое и сбивает, по предложенному им ответу, он хочет искать максимальный результат между смежными датами.
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39494577
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

01.09.2014 и 01.01.2017 cмежные по какому критерию?

.....
stax
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39494718
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..MaximaXXL,

01.09.2014 и 01.01.2017 cмежные по какому критерию?

.....
stax

Да я без руля не моя постановка

Просто прикинул ответ, который написал tenmonan и он получается если написать что-то такое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with src as ( select 193 i, to_date('01.07.2014','dd.mm.yyyy') d, 50000 v from dual union
              select 193 i, to_date('01.08.2014','dd.mm.yyyy') d, 6000 v from dual union
              select 193 i, to_date('01.09.2014','dd.mm.yyyy') d, 700000 v from dual union
              select 193 i, to_date('01.01.2017','dd.mm.yyyy') d, 3301.57 v from dual union
              select 193 i, to_date('01.04.2017','dd.mm.yyyy') d, 0 v from dual union
              select 269 i, to_date('01.12.2013','dd.mm.yyyy') d, 9274.666667 v from dual union
              select 269 i, to_date('01.01.2014','dd.mm.yyyy') d, 23183.92 v from dual union
              select 269 i, to_date('01.09.2016','dd.mm.yyyy') d, 22883.92 v from dual union
              select 269 i, to_date('01.11.2016','dd.mm.yyyy') d, 12100 v from dual union
              select 269 i, to_date('01.12.2016','dd.mm.yyyy') d, 3546 v from dual union
              select 269 i, to_date('01.01.2017','dd.mm.yyyy') d, 21983.92 v from dual union
              select 269 i, to_date('01.03.2017','dd.mm.yyyy') d, 0 v from dual )
              
select i, 
       max(d_prev) KEEP (DENSE_RANK LAST ORDER BY delta nulls first) from_, 
       max(d) KEEP (DENSE_RANK LAST ORDER BY delta nulls first) to_
  from (
        select i, d, lag(d,1,d) over (partition by i order by d) d_prev, d-lag(d,1,d) over (partition by i order by d) delta
        from src)
group by i
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39495774
tenmonan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Азагаш,

поле ost это не разница между датами, это отдельное поле
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39495776
tenmonan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valergrad, спасибо!

с помощью lag удалось решить задачу
...
Рейтинг: 0 / 0
нахождение максимальной разницы между записями
    #39496402
Азагаш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tenmonan,
было бы неплохо представить общественности финальный вариант решения
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / нахождение максимальной разницы между записями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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