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

Откуда:
Сообщений: 114
Здравствуйте. Необходимом выбирать следующее значение по подгруппам, как это можно реализовать?
select a.*, lead(n) OVER (order by mark) as qwe
from auto a
order by mark

Результат требуется, как в столбце result (в прикреплённом скриншоте)

К сообщению приложен файл. Размер - 26Kb
25 апр 19, 06:03    [21871115]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1431
Никита А,

без претензий на оригинальность, просто пища для размышлений:
with t as (
select 1 as num from dual union all
select 1 as num from dual union all
select 2 as num from dual union all
select 2 as num from dual union all
select 3 as num from dual union all
select 3 as num from dual union all
select 3 as num from dual union all
select 4 as num from dual
)
select v.num, max(lead_num) over(partition by num) as next_num
  from (
         select t.*
              , case lead(num) over(order by num) 
                  when num
                    then null
                  else lead(num) over(order by num) 
                end as lead_num
           from t
       ) v
Проверка
25 апр 19, 06:58    [21871130]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1431
Никита А,

Для любителей более короткого, но менее понятного кода:
with t as (
select 1 as num from dual union all
select 1 as num from dual union all
select 2 as num from dual union all
select 2 as num from dual union all
select 3 as num from dual union all
select 3 as num from dual union all
select 3 as num from dual union all
select 4 as num from dual
)
select v.num
     , max(decode(v.lead_num, v.num, null, v.lead_num)) over(partition by v.num) as next_num
  from (
         select t.*
              , lead(num) over(order by num) as lead_num
           from t
       ) v
25 апр 19, 07:06    [21871135]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
-2-
Member

Откуда:
Сообщений: 14994
Щукина Анна
... over(partition by num) ...
...
... over(order by num) ...
условия задачи иные
25 апр 19, 07:30    [21871148]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Никита А
Member

Откуда:
Сообщений: 114
Щукина Анна,
Спасибо, разобрал Ваш метод, им и воспользуюсь
25 апр 19, 07:35    [21871150]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1431
-2-,

Предложенный код - и не решение, а лишь направление, куда двигаться.
Но в целом - да, если возможно чередование одних и тех же групп, то, как минимум, нужно прикрутить что-то типа start_of_group-метода, для "уникализации" групп с учетом возможного их повторения.
25 апр 19, 08:17    [21871169]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2012
Никита А,

SQL> ed
Wrote file afiedt.buf

  1  with auto(mark,n) as (
  2  select 'BMW',3 from dual union all
  3  select 'BMW',4 from dual union all
  4  select 'BMW',5 from dual union all
  5  select 'AUDI',1 from dual union all
  6  select 'AUDI',1 from dual union all
  7  select 'LADA',3 from dual union all
  8  select 'LADA',3 from dual union all
  9  select 'VOLVO',10 from dual union all
 10  select 'LADA',3 from dual)
 11  select mark,n
 12  -- ,last_value(l ignore nulls) over (partition by mark order by mark,l) r
 13     ,max(l) over (partition by mark) r
 14  from (
 15   select a.*,decode(lead(mark,1,mark) OVER (order by mark,n),mark,cast(null as number),n) l
 16   from auto a) t
 17* order by mark,n
SQL> /

MARK           N          R
----- ---------- ----------
AUDI           1          1
AUDI           1          1
BMW            3          5
BMW            4          5
BMW            5          5
LADA           3          3
LADA           3          3
LADA           3          3
VOLVO         10

9 rows selected.


.....
stax
25 апр 19, 08:50    [21871192]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29402
Щукина Анна
Предложенный код - и не решение, а лишь направление, куда двигаться.
Я тоже знаю такое (ну, может быть, самую малость общее) направление - SQL Reference.
25 апр 19, 09:15    [21871206]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Stax
Member

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

ой, не то запостил, удаляйте 21871192

....
stax
25 апр 19, 09:27    [21871216]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2012
Никита А,

если n разное для авто

  1  with auto(mark,n) as (
  2  select 'BMW',5 from dual union all
  3  select 'BMW',6 from dual union all
  4  select 'BMW',7 from dual union all
  5  select 'AUDI',1 from dual union all
  6  select 'AUDI',1 from dual union all
  7  select 'LADA',3 from dual union all
  8  select 'LADA',3 from dual union all
  9  select 'VOLVO',10 from dual union all
 10  select 'LADA',3 from dual)
 11  select mark,n
 12     ,max(l) over (partition by mark) r
 13  --   ,last_value(l ignore nulls) over (partition by mark order by l) r2
 14  from (
 15   select a.*,decode(lead(mark,1,mark) OVER (order by mark),mark
 16                    ,cast(null as number),lead(n) OVER (order by mark,n)) l
 17   from auto a) t
 18* order by mark,n
SQL> /

MARK           N          R
----- ---------- ----------
AUDI           1          5
AUDI           1          5
BMW            5          3
BMW            6          3
BMW            7          3
LADA           3         10
LADA           3         10
LADA           3         10
VOLVO         10
25 апр 19, 09:41    [21871237]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Никита А
Member

Откуда:
Сообщений: 114
Stax,
Суть та же, спасибо за ответ, для меня было важно понять алгоритм, а адаптировать уже не проблема.
Теперь задача сложнее, сделать тоже самое, только надо вытащить данные через одну партицию.
26 апр 19, 05:17    [21872140]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1431
Никита А
Теперь задача сложнее, сделать тоже самое, только надо вытащить данные через одну партицию.
На самом деле - всё тоже самое. Только теперь все манипуляции нужно применить не к исходным данным, а к результату вычислений, полученных после первой итерации обработки...
26 апр 19, 05:29    [21872144]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Никита А
Member

Откуда:
Сообщений: 114
Щукина Анна
На самом деле - всё тоже самое. Только теперь все манипуляции нужно применить не к исходным данным, а к результату вычислений, полученных после первой итерации обработки...

Слишком много наворотов получается, уверен есть другой способ, чтобы обойтись также одним подзапросом
26 апр 19, 06:36    [21872149]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2012
Никита А
Теперь задача сложнее, сделать тоже самое, только надо вытащить данные через одну партицию.

если версия позволяет, можно попробовать моделькой или MATCH_RECOGNIZE

ps
неплохо било-б выложить данные (with) и что получить

.....
stax
26 апр 19, 08:51    [21872207]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2012
Stax
можно попробовать моделькой

.....
stax

  1  with auto(mark,n) as (
  2  select 'BMW',5 from dual union all
  3  select 'BMW',6 from dual union all
  4  select 'BMW',7 from dual union all
  5  select 'VW',0 from dual union all
  6  select 'VW',1 from dual union all
  7  select 'VW',2 from dual union all
  8  select 'VW',3 from dual union all
  9  select 'AUDI',1 from dual union all
 10  select 'AUDI',1 from dual union all
 11  select 'LADA',3 from dual union all
 12  select 'LADA',3 from dual union all
 13  select 'VOLVO',10 from dual union all
 14  select 'LADA',3 from dual)
 15  select *
 16  from auto
 17    model
 18      dimension by(
 19          dense_rank() over(order by mark) r1,row_number() over(partition by mark order by n) r2)
 20      measures(mark,n,0 rezult)
 21      rules(
 22      rezult[any,any] /*order by r1,r2*/ = n[cv()+2,1]
 23            )
 24* order by mark,r1,r2
SQL> /

        R1         R2 MARK           N     REZULT
---------- ---------- ----- ---------- ----------
         1          1 AUDI           1          3
         1          2 AUDI           1          3
         2          1 BMW            5         10
         2          2 BMW            6         10
         2          3 BMW            7         10
         3          1 LADA           3          0
         3          2 LADA           3          0
         3          3 LADA           3          0
         4          1 VOLVO         10
         5          1 VW             0
         5          2 VW             1
         5          3 VW             2
         5          4 VW             3

13 rows selected.


....
stax
26 апр 19, 09:14    [21872222]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2012
Stax,
ой
order by r1,r2

.....
stax
26 апр 19, 09:19    [21872230]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6745
Никита А
уверен есть другой способ

конечно есть, уволить Вас и нанять нормального программиста
26 апр 19, 12:08    [21872466]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Никита А
Member

Откуда:
Сообщений: 114
alex-ls
Никита А
уверен есть другой способ

конечно есть, уволить Вас и нанять нормального программиста

Люблю такие советы, есть ещё? Накидывай, посмеёмся умник.
1 ноя 19, 09:45    [22007762]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29402
Никита А
Люблю такие советы, есть ещё? Накидывай, посмеёмся умник.
Он-то - умник, а ты-то - тормоз. Тебе плакать надо.
1 ноя 19, 11:08    [22007870]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
AmKad
Member

Откуда:
Сообщений: 5111
with auto(mark,n) as (
select 'BMW',5 from dual union all
select 'BMW',5 from dual union all
select 'BMW',5 from dual union all
select 'AUDI',1 from dual union all
select 'AUDI',1 from dual union all
select 'LADA',3 from dual union all
select 'LADA',3 from dual union all
select 'VOLVO',10 from dual union all
select 'LADA',3 from dual)
select t.*,
lead(lg ignore nulls) over (order by mark) new_n
from
   (select t.*,
    lag(null, 1, n) over (partition by mark order by null) lg
    from auto t
   ) t;

MARK           N LG     NEW_N
----- ---------- ------ --------
AUDI           1 1      5
AUDI           1        5
BMW            5 5      3
BMW            5        3
BMW            5        3
LADA           3 3      10
LADA           3        10
LADA           3        10
VOLVO         10 10

9 rows selected.
1 ноя 19, 11:55    [22007948]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Никита А
Member

Откуда:
Сообщений: 114
Elic
Никита А
Люблю такие советы, есть ещё? Накидывай, посмеёмся умник.
Он-то - умник, а ты-то - тормоз. Тебе плакать надо.

Умник в кавычках конечно. Что он умного написал? Совет типа, если что-то не получается, убиться сразу? Или нашёл место где можно юмором блеснуть?
1 ноя 19, 12:01    [22007959]     Ответить | Цитировать Сообщить модератору
 Re: Как вывести следующее значение группы  [new]
Никита А
Member

Откуда:
Сообщений: 114
AmKad
with auto(mark,n) as (
select 'BMW',5 from dual union all
select 'BMW',5 from dual union all
select 'BMW',5 from dual union all
select 'AUDI',1 from dual union all
select 'AUDI',1 from dual union all
select 'LADA',3 from dual union all
select 'LADA',3 from dual union all
select 'VOLVO',10 from dual union all
select 'LADA',3 from dual)
select t.*,
lead(lg ignore nulls) over (order by mark) new_n
from
   (select t.*,
    lag(null, 1, n) over (partition by mark order by null) lg
    from auto t
   ) t;

MARK           N LG     NEW_N
----- ---------- ------ --------
AUDI           1 1      5
AUDI           1        5
BMW            5 5      3
BMW            5        3
BMW            5        3
LADA           3 3      10
LADA           3        10
LADA           3        10
VOLVO         10 10

9 rows selected.

Спасибо Вам, и тем кто помогал решить проблему, в особенности "Щукина Анна" за оперативность, задача была решена в первые дни.
1 ноя 19, 12:11    [22007975]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить