powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как вывести следующее значение группы
22 сообщений из 22, страница 1 из 1
Как вывести следующее значение группы
    #39805953
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Необходимом выбирать следующее значение по подгруппам, как это можно реализовать?
Код: plsql
1.
2.
3.
select a.*, lead(n) OVER (order by mark) as qwe
from auto a
order by mark


Результат требуется, как в столбце result (в прикреплённом скриншоте)
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39805960
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита А,

без претензий на оригинальность, просто пища для размышлений:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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

Проверка
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39805962
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита А,

Для любителей более короткого, но менее понятного кода:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39805971
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна
Код: plsql
1.
2.
3.
... over(partition by num) ...
...
... over(order by num) ...

условия задачи иные
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39805973
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
Спасибо, разобрал Ваш метод, им и воспользуюсь
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39805987
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

Предложенный код - и не решение, а лишь направление, куда двигаться.
Но в целом - да, если возможно чередование одних и тех же групп, то, как минимум, нужно прикрутить что-то типа start_of_group-метода, для "уникализации" групп с учетом возможного их повторения.
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806001
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита А,

Код: 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.
33.
34.
35.
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
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806008
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаПредложенный код - и не решение, а лишь направление, куда двигаться.Я тоже знаю такое (ну, может быть, самую малость общее) направление - SQL Reference.
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806012
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

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

....
stax
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806015
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита А,

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

Код: 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.
  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
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806549
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Суть та же, спасибо за ответ, для меня было важно понять алгоритм, а адаптировать уже не проблема.
Теперь задача сложнее, сделать тоже самое, только надо вытащить данные через одну партицию.
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806550
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита АТеперь задача сложнее, сделать тоже самое, только надо вытащить данные через одну партицию.На самом деле - всё тоже самое. Только теперь все манипуляции нужно применить не к исходным данным, а к результату вычислений, полученных после первой итерации обработки...
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806555
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаНа самом деле - всё тоже самое. Только теперь все манипуляции нужно применить не к исходным данным, а к результату вычислений, полученных после первой итерации обработки...
Слишком много наворотов получается, уверен есть другой способ, чтобы обойтись также одним подзапросом
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806573
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита АТеперь задача сложнее, сделать тоже самое, только надо вытащить данные через одну партицию.
если версия позволяет, можно попробовать моделькой или MATCH_RECOGNIZE

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

.....
stax
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806578
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxможно попробовать моделькой

.....
stax
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
  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
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806580
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
ой
order by r1,r2

.....
stax
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39806691
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита Ауверен есть другой способ
конечно есть, уволить Вас и нанять нормального программиста
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39884011
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-lsНикита Ауверен есть другой способ
конечно есть, уволить Вас и нанять нормального программиста
Люблю такие советы, есть ещё? Накидывай, посмеёмся умник.
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39884088
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никита АЛюблю такие советы, есть ещё? Накидывай, посмеёмся умник.Он-то - умник, а ты-то - тормоз. Тебе плакать надо.
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39884144
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
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.
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39884153
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicНикита АЛюблю такие советы, есть ещё? Накидывай, посмеёмся умник.Он-то - умник, а ты-то - тормоз. Тебе плакать надо.
Умник в кавычках конечно. Что он умного написал? Совет типа, если что-то не получается, убиться сразу? Или нашёл место где можно юмором блеснуть?
...
Рейтинг: 0 / 0
Как вывести следующее значение группы
    #39884166
Никита А
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad
Код: 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.
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.


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


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