powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / нестандартная группировка
13 сообщений из 13, страница 1 из 1
нестандартная группировка
    #39802180
abort
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу сделать группировку по полю С.
Там где в поле D стоит 1 нужно в поле С +- 3 значения включить в группу


C D
545 1
546 2
640 1
973 1
975 2
974 2

группировка по столбцу С плюс минус 3 от значения 1 в поле D 545 - 3 и 545 + 3 = 542 и 548
1 группа
545 1
546 2

2 группа
640 1

3 группа
973 1 - 970 и 976
975 2
974 2

в какую сторону смотреть
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802196
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abortв какую сторону смотретьУточнить постановку, привести репрезентативные данные.
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802198
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abort,

642 1
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802205
abort
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
545 в поле С имеет значение 1 в поле D,
значит в группу надо включить все значения в поле С, которые +- 3 от 545, т.е. в интервал between 545-3 and 545+3
т.е. 546 должна войти в группу к 545

тоже самое 973 имеет значение 1 в поле D, поэтому в эту групge должны попасть все в диапазоне 973 -3 and 973 + 3
т.е. 974 и 975 должны попасть в группу к 973

а 640 только один будет в группе, потому что нету 637, 638, 639, 641, 642, 643
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802210
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abort,

это замечательно, что ты разъяснил, сколько будет 545+3.
Осталось 21863844
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802221
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abort,

хрустальный шар
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t(c,d) as (
select 545, 1 from dual union all
select 546, 2 from dual union all
select 640, 1 from dual union all
select 973, 1 from dual union all
select 975, 2 from dual union all
select 974, 2 from dual
)
select 
t.*, t1.t_group
from t, (select c, row_number() over(order by c) t_group from t where d=1) t1 where t.c between t1.c - 3 and t1.c+3 
order by 3, 1



Regards
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802234
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abort,


Ну и что делать если C подходит сразу нескольким группам:

Код: plsql
1.
2.
3.
4.
C   D
545 1
547 2
549 1



SY.
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802277
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abort,

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t(c,d) as (
  2  select 545, 1 from dual union all
  3  select 546, 2 from dual union all
  4  select 640, 1 from dual union all
  5  select 973, 1 from dual union all
  6  select 975, 2 from dual union all
  7  select 974, 2 from dual
  8  )
  9  select
 10   t1.c g,t2.*
 11* from t t1,t t2  where t1.d=1 and t2.c between t1.c-3 and t1.c+3
SQL> /

         G          C          D
---------- ---------- ----------
       545        545          1
       545        546          2
       640        640          1
       973        973          1
       973        974          2
       973        975          2

6 rows selected.



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

Аналитика:

Код: 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.
with t(c,d) as (
select 545, 1 from dual union all
select 546, 2 from dual union all
select 640, 1 from dual union all
select 973, 1 from dual union all
select 975, 2 from dual union all
select 974, 2 from dual
)
select  c,
        d,
        max(case d when 1 then c end) over(
                                           order by c
                                           range between 3 preceding and 3 following
                                          ) grp
  from  t
  order by c
/

         C          D        GRP
---------- ---------- ----------
       545          1        545
       546          2        545
       640          1        640
       973          1        973
       974          2        973
       975          2        973

6 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802375
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
правила какие-то не очень определенные, поэтому просто набросок:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with t(C,D) as (
   select 545, 1 from dual union all
   select 546, 2 from dual union all
   select 640, 1 from dual union all
   select 973, 1 from dual union all
   select 975, 2 from dual union all
   select 974, 2 from dual
)
select
   *
from t
MATCH_RECOGNIZE (
   order by c
   MEASURES  STRT.c AS start_c
            ,FINAL LAST(UP.c) last_c
            ,MATCH_NUMBER() AS match_num
   all rows per match
   PATTERN (STRT UP*)
     DEFINE
        UP AS UP.c between prev(UP.c) and prev(UP.c)+3 and UP.c <= first(UP.c)+6
   )
/


CSTART_CLAST_CMATCH_NUMD545545546115465455461264064021973973975319749739753297597397532
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802435
abort
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично. Похоже все решения правильны.
Правда последний с патернами и MATCH_RECOGNIZE очень замудренный, хотя ответ тоже правильный
Всем спасибо за интересные решения. Век живи век учись!!!
...
Рейтинг: 0 / 0
нестандартная группировка
    #39802466
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abortОтлично. Похоже все решения правильны.
Правда последний с патернами и MATCH_RECOGNIZE очень замудренный, хотя ответ тоже правильный

Код: 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.
?
with t(C,D) as (
   select 100, 2 from dual union all
   select 101, 1 from dual union all
   select 102, 2 from dual union all
   select 103, 2 from dual union all
   select 104, 2 from dual union all
   select 105, 2 from dual union all
   select 106, 2 from dual union all
   select 107, 2 from dual union all
   select 108, 2 from dual union all
   select 109, 2 from dual union all
   select 110, 2 from dual union all
--
   select 545, 1 from dual union all
   select 546, 2 from dual union all
   select 640, 1 from dual union all
   select 973, 1 from dual union all
   select 975, 2 from dual union all
   select 974, 2 from dual
)
select
   *
from t
MATCH_RECOGNIZE (
   order by c
   MEASURES  STRT.c AS start_c
            ,FINAL LAST(UP.c) last_c
            ,MATCH_NUMBER() AS match_num
   all rows per match
   PATTERN (STRT UP*)
     DEFINE
        UP AS UP.c between prev(UP.c) and prev(UP.c)+3 and UP.c <= first(UP.c)+6
   )



мож ?
Код: 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.
with t(C,D) as (
   select 100, 2 from dual union all
   select 101, 1 from dual union all
   select 102, 2 from dual union all
   select 103, 2 from dual union all
   select 104, 2 from dual union all
   select 105, 2 from dual union all
   select 106, 2 from dual union all
   select 107, 2 from dual union all
   select 108, 2 from dual union all
   select 109, 2 from dual union all
   select 110, 2 from dual union all
--
   select 545, 1 from dual union all
   select 546, 2 from dual union all
   select 640, 1 from dual union all
   select 973, 1 from dual union all
   select 975, 2 from dual union all
   select 974, 2 from dual
)
select
   *
from t
MATCH_RECOGNIZE (
   order by c
   MEASURES  STRT.c AS start_c
            ,FINAL LAST(UP.c) last_c
            ,MATCH_NUMBER() AS match_num
   all rows per match
   PATTERN (STRT UP*)
     DEFINE
        strt as d=1
        ,UP AS UP.c between strt.c-3 and strt.c+3 
   )



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


GRP 105?

Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
SQL> with t(C,D) as (
  2     select 100, 2 from dual union all
  3     select 101, 1 from dual union all
  4     select 102, 2 from dual union all
  5     select 103, 1 from dual union all
  6     select 104, 2 from dual union all
  7     select 105, 1 from dual union all
  8     select 106, 2 from dual union all
  9     select 107, 2 from dual union all
 10     select 108, 2 from dual union all
 11     select 109, 2 from dual union all
 12     select 110, 2 from dual union all
 13  --
 14     select 545, 1 from dual union all
 15     select 546, 2 from dual union all
 16     select 640, 1 from dual union all
 17     select 973, 1 from dual union all
 18     select 975, 2 from dual union all
 19     select 974, 2 from dual
 20  )
 21  select  c,
 22          d,
 23          max(case d when 1 then c end) over(
 24                                             order by c
 25                                             range between 3 preceding and 3 following
 26                                            ) grp
 27    from  t
 28    order by c
 29  /

         C          D        GRP
---------- ---------- ----------
       100          2        103
       101          1        103
       102          2        105
       103          1        105
       104          2        105
       105          1        105
       106          2        105
       107          2        105
       108          2        105
       109          2
       110          2
       545          1        545
       546          2        545
       640          1        640
       973          1        973
       974          2        973
       975          2        973

17 rows selected.



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


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