Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / нестандартная группировка / 13 сообщений из 13, страница 1 из 1
16.04.2019, 14:40
    #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
16.04.2019, 14:48
    #39802196
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная группировка
abortв какую сторону смотретьУточнить постановку, привести репрезентативные данные.
...
Рейтинг: 0 / 0
16.04.2019, 14:51
    #39802198
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная группировка
abort,

642 1
...
Рейтинг: 0 / 0
16.04.2019, 14:58
    #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
16.04.2019, 15:08
    #39802210
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная группировка
abort,

это замечательно, что ты разъяснил, сколько будет 545+3.
Осталось 21863844
...
Рейтинг: 0 / 0
16.04.2019, 15:24
    #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
16.04.2019, 15:38
    #39802234
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная группировка
abort,


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

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



SY.
...
Рейтинг: 0 / 0
16.04.2019, 16:55
    #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
16.04.2019, 18:02
    #39802346
SY
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
16.04.2019, 19:13
    #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
17.04.2019, 06:33
    #39802435
abort
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная группировка
Отлично. Похоже все решения правильны.
Правда последний с патернами и MATCH_RECOGNIZE очень замудренный, хотя ответ тоже правильный
Всем спасибо за интересные решения. Век живи век учись!!!
...
Рейтинг: 0 / 0
17.04.2019, 08:49
    #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
17.04.2019, 09:08
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / нестандартная группировка / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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