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


Результат требуется, как в столбце result (в прикреплённом скриншоте)
...
Рейтинг: 0 / 0
25.04.2019, 06:58
    #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
25.04.2019, 07:06
    #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
25.04.2019, 07:30
    #39805971
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
Щукина Анна
Код: plsql
1.
2.
3.
... over(partition by num) ...
...
... over(order by num) ...

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

Предложенный код - и не решение, а лишь направление, куда двигаться.
Но в целом - да, если возможно чередование одних и тех же групп, то, как минимум, нужно прикрутить что-то типа start_of_group-метода, для "уникализации" групп с учетом возможного их повторения.
...
Рейтинг: 0 / 0
25.04.2019, 08:50
    #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
25.04.2019, 09:15
    #39806008
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
Щукина АннаПредложенный код - и не решение, а лишь направление, куда двигаться.Я тоже знаю такое (ну, может быть, самую малость общее) направление - SQL Reference.
...
Рейтинг: 0 / 0
25.04.2019, 09:27
    #39806012
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
Stax,

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

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

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

.....
stax
...
Рейтинг: 0 / 0
26.04.2019, 09:14
    #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
26.04.2019, 09:19
    #39806580
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
Stax,
ой
order by r1,r2

.....
stax
...
Рейтинг: 0 / 0
26.04.2019, 12:08
    #39806691
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
Никита Ауверен есть другой способ
конечно есть, уволить Вас и нанять нормального программиста
...
Рейтинг: 0 / 0
01.11.2019, 09:45
    #39884011
Никита А
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
alex-lsНикита Ауверен есть другой способ
конечно есть, уволить Вас и нанять нормального программиста
Люблю такие советы, есть ещё? Накидывай, посмеёмся умник.
...
Рейтинг: 0 / 0
01.11.2019, 11:08
    #39884088
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
Никита АЛюблю такие советы, есть ещё? Накидывай, посмеёмся умник.Он-то - умник, а ты-то - тормоз. Тебе плакать надо.
...
Рейтинг: 0 / 0
01.11.2019, 11:55
    #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
01.11.2019, 12:01
    #39884153
Никита А
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести следующее значение группы
ElicНикита АЛюблю такие советы, есть ещё? Накидывай, посмеёмся умник.Он-то - умник, а ты-то - тормоз. Тебе плакать надо.
Умник в кавычках конечно. Что он умного написал? Совет типа, если что-то не получается, убиться сразу? Или нашёл место где можно юмором блеснуть?
...
Рейтинг: 0 / 0
01.11.2019, 12:11
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как вывести следующее значение группы / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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