Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / нахождение максимальной разницы между записями / 10 сообщений из 10, страница 1 из 1
24.07.2017, 18:19
    #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
24.07.2017, 19:05
    #39494157
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нахождение максимальной разницы между записями
Можно и без циклов, одним запросом. Почитайте про аналитические функции:
https://docs.oracle.com/cloud/latest/db112/SQLRF/functions004.htm

Конкретно есть функция lag.
...
Рейтинг: 0 / 0
25.07.2017, 12:02
    #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
25.07.2017, 12:48
    #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
25.07.2017, 12:50
    #39494512
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нахождение максимальной разницы между записями
Азагаш,

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

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

.....
stax
...
Рейтинг: 0 / 0
25.07.2017, 16:35
    #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
27.07.2017, 10:09
    #39495774
tenmonan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нахождение максимальной разницы между записями
Азагаш,

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

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


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