Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Комплексная группировка значений / 25 сообщений из 37, страница 1 из 2
20.02.2020, 16:27
    #39929012
Tom333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Доброго времени суток, друзья!
Постигаю основы sql, пытаюсь разобраться с комплексными группировками, но пока что не выходит каменный цветок=не варит мой старый котелок :) Буду благодарен за помощь со следующей задачей:
Сгруппировать в выборке из таб1 те значения столбца a, для которых совпадает кол-во строк, а также соответствующие значения столбцов b, c и d равны между собой.
Исходная таблица:

Результат:

По логике понимаю, что вероятно надо сделать последовательный построковый перебор со сравнением значений, но как это уложить в sql скрипт - для меня загадка
...
Рейтинг: 0 / 0
20.02.2020, 16:37
    #39929025
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Tom333,
если строк в группе не много (поместится в varchar2) то группа list_aag

зи
лень набивать данные

.....
stax
...
Рейтинг: 0 / 0
20.02.2020, 17:03
    #39929048
Tom333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Stax, спасибо! У меня была вторая идея склеить их в одно, а потом сравнивать полученные значения, в varchar2 поместится с головой. Но не могу сообразить как сделать чтобы сначала выстроить по алфавиту, потом склеить, а потом выполнить сравнение.
Потому что если склеить AT1+AS2+AH3, а в другом случае AS2+AT1+AH3, то результат сравнения будет не удовлетворительный.
Неудобно просить, но буду благодарен если найдете время накидать основу скрипта. Сейчас пробую сам наваять, но пока выходит не очень :)
...
Рейтинг: 0 / 0
20.02.2020, 17:08
    #39929050
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
вариант
Код: 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.
with tab1(a, b,c,d) as
(
Select  1, 'A', 'T', 1
From dual
union all
Select  1, 'A', 'S', 2
From dual
union all
Select  1, 'A', 'H', 3
From dual
----
union all
Select  2, 'A', 'T', 1
From dual
union all
Select  2, 'A', 'S', 2
From dual
----
union all
Select  3, 'A', 'T', 1
From dual
union all
Select  3, 'A', 'S', 2
From dual
union all
Select  3, 'A', 'H', 3
From dual
)
, tc as (
  Select 
   count(*) over(partition by a) as cnt
   , tab1.*
  from tab1
)
Select a From (
  Select t1.a
  from tc t1
   full outer join tc t2 
       on t1.cnt = t2.cnt
       and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
  Where t1.a is not null and t2.a is not null     
)
Group by a
Order by a 


...
Рейтинг: 0 / 0
20.02.2020, 17:38
    #39929070
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Магия данных:

Код: 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 tab1 as(
           select 1 a,'A' b,'T' c,1 d from dual union all
           select 1 a,'A' b,'S' c,2 d from dual union all
           select 1 a,'A' b,'H' c,3 d from dual union all
           select 1 a,'X' b,'X' c,4 d from dual union all
           select 3 a,'A' b,'T' c,1 d from dual union all
           select 3 a,'A' b,'S' c,2 d from dual union all
           select 3 a,'A' b,'H' c,3 d from dual union all
           select 3 a,'Y' b,'Y' c,4 d from dual
          )
, tc as (
  Select
   count(*) over(partition by a) as cnt
   , tab1.*
  from tab1
)
Select a From (
  Select t1.a
  from tc t1
   full outer join tc t2
       on t1.cnt = t2.cnt
       and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
  Where t1.a is not null and t2.a is not null
)
Group by a
Order by a
/

         A
----------
         1
         3

SQL>



Что-то типа:

Код: 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.
with t as (
           select 1 a,'A' b,'T' c,1 d from dual union all
           select 1 a,'A' b,'S' c,2 d from dual union all
           select 1 a,'A' b,'H' c,3 d from dual union all
           select 1 a,'X' b,'X' c,4 d from dual union all
           select 3 a,'A' b,'T' c,1 d from dual union all
           select 3 a,'A' b,'S' c,2 d from dual union all
           select 3 a,'A' b,'H' c,3 d from dual union all
           select 3 a,'Y' b,'Y' c,4 d from dual
          ),
     x as (
           select  count(*) cnt,
                   a,
                   collect(b) b_list,
                   collect(c) c_list,
                   collect(d) d_list
             from  t
             group by a
          )
select  a
  from  x x1
  where exists (
                select  1
                  from  x x2
                  where x2.a != x1.a
                    and x2.cnt = x1.cnt
                    and x2.b_list = x1.b_list
                    and x2.c_list = x1.c_list
                    and x2.d_list = x1.d_list
               )
/

no rows selected

SQL>



SY.
...
Рейтинг: 0 / 0
20.02.2020, 17:47
    #39929079
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
тупо слепить все в кучу и отранжировать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select 
a,b,c,d, dense_rank() over(order by lagg_bcd) grp
from (
select 
t.*, listagg(b||';'||c||';'||d) within group (order by b,c,d) over(partition by a ) lagg_bcd
from t
)
order by a,d

...
Рейтинг: 0 / 0
20.02.2020, 17:51
    #39929080
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
SY,
спасибо.
в логиках я слабоват.
От того sql-ем не владею.

с Exist-ом и без collect-а всякий сможет...
:)
а так тоже магия?

Код: 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.
with tab1(a, b,c,d) as
(
Select  1, 'A', 'T', 1
From dual
union all
Select  1, 'A', 'S', 2
From dual
union all
Select  1, 'A', 'H', 3
From dual
union all 
select 1 , 'X', 'X' , 4 from dual 
----
union all
Select  2, 'A', 'T', 1
From dual
union all
Select  2, 'A', 'S', 2
From dual
----
union all
Select  3, 'A', 'T', 1
From dual
union all
Select  3, 'A', 'S', 2
From dual
union all
Select  3, 'A', 'H', 3
From dual
union all 
select 3, 'Y', 'Y', 4 from dual
)
, tc as (
  Select 
   count(*) over(partition by a) as cnt
   , tab1.*
  from tab1
)
Select a From (
  Select t1.a, t1.cnt 
  from tc t1
   full outer join tc t2 
       on t1.cnt = t2.cnt
       and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
  Where t1.a is not null and t2.a is not null     
)
Group by a, cnt
having count(*) = cnt
Order by a     

...
Рейтинг: 0 / 0
20.02.2020, 17:57
    #39929087
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Выкинуть full outer - он тут совсем не нужен. Допилить проверкой числа строк в поле а после GROUP BY с числом строк в поле а

Код: 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.
with tab1 as(
           select 1 a,'A' b,'T' c,1 d from dual union all
           select 1 a,'A' b,'S' c,2 d from dual union all
           select 1 a,'A' b,'H' c,3 d from dual union all
           select 3 a,'A' b,'T' c,1 d from dual union all
           select 3 a,'A' b,'S' c,2 d from dual union all
           select 3 a,'A' b,'H' c,3 d from dual union all
           select 5 a,'A' b,'T' c,1 d from dual union all
           select 5 a,'A' b,'S' c,2 d from dual union all
           select 5 a,'A' b,'H' c,3 d from dual
          )
, tc as (
  Select
   count(*) over(partition by a) as cnt
   , tab1.*
  from tab1
)
Select a From (
  Select t1.a,t2.a t2_a,t1.cnt cnt
  from tc t1
   join tc t2
       on t1.cnt = t2.cnt
       and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
)
Group by a,t2_a
having count(*) = max(cnt)
Order by a
/

         A
----------
         1
         3
         5

SQL>



SY.
...
Рейтинг: 0 / 0
20.02.2020, 18:08
    #39929097
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
booby

а так тоже магия?


Тоже магия:

Код: 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.
with tab1 as(
           select 1 a,'A' b,'T' c,1 d from dual union all
           select 1 a,'A' b,'S' c,2 d from dual union all
           select 1 a,'A' b,'H' c,3 d from dual union all
           select 3 a,'A' b,'T' c,1 d from dual union all
           select 3 a,'A' b,'S' c,2 d from dual union all
           select 3 a,'A' b,'H' c,3 d from dual union all
           select 5 a,'A' b,'T' c,1 d from dual union all
           select 5 a,'A' b,'S' c,2 d from dual union all
           select 5 a,'A' b,'H' c,3 d from dual
          )
, tc as (
  Select 
   count(*) over(partition by a) as cnt
   , tab1.*
  from tab1
)
Select a From (
  Select t1.a, t1.cnt 
  from tc t1
   full outer join tc t2 
       on t1.cnt = t2.cnt
       and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
  Where t1.a is not null and t2.a is not null     
)
Group by a, cnt
having count(*) = cnt
Order by a
/

no rows selected

SQL>



Я уже показал как допилить твое решение.

SY.
...
Рейтинг: 0 / 0
20.02.2020, 18:35
    #39929117
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Tom333,

основа c listaag

Код: 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.
with tab1 as(
           select 1 a,'A' b,'T' c,1 d from dual union all
           select 1 a,'A' b,'H' c,3 d from dual union all
           select 1 a,'A' b,'S' c,2 d from dual union all
--
           select 2 a,'A' b,'T' c,1 d from dual union all
           select 2 a,'A' b,'S' c,2 d from dual union all
--
           select 3 a,'A' b,'T' c,1 d from dual union all
           select 3 a,'A' b,'S' c,2 d from dual union all
           select 3 a,'A' b,'H' c,3 d from dual union all
--
           select 4 a,'B' b,'T' c,1 d from dual union all
           select 4 a,'B' b,'S' c,2 d from dual union all
--
           select 5 a,'A' b,'T' c,1 d from dual union all
           select 5 a,'A' b,'S' c,2 d from dual union all
--           select 5 a,'A' b,'H' c,3 d from dual union all
--
           select 6 a,'B' b,'T' c,1 d from dual union all
           select 6 a,'B' b,'S' c,2 d from dual union all
--
           select 7 a,'A' b,'T' c,1 d from dual
          )
, t as (
select 
 a,listagg(b||'#'||c||'#'||d ) WITHIN GROUP (ORDER BY b,c,d,rownum )  s
from tab1
group by a
)
select t.*
,DENSE_RANK() OVER(ORDER BY s) gr
 from t
order by gr,a
/
SQL> /

         A S                                                GR
---------- ---------------------------------------- ----------
         1 A#H#3A#S#2A#T#1                                   1
         3 A#H#3A#S#2A#T#1                                   1
         2 A#S#2A#T#1                                        2
         5 A#S#2A#T#1                                        2
         7 A#T#1                                             3
         4 B#S#2B#T#1                                        4
         6 B#S#2B#T#1                                        4


ps
можно listaag и раздельно для каждого поля

pss
много вариантов накидали, мож они и луче, я внимательно не смотрел

....
stax
...
Рейтинг: 0 / 0
20.02.2020, 18:36
    #39929119
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
сорри, не видел 22084054

....
stax
...
Рейтинг: 0 / 0
20.02.2020, 19:15
    #39929150
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Stax
можно listaag и раздельно для каждого поля

Можн listagg от
Код: plsql
1.
dense_rank() over(order by b,c,d)


Так больше поместится :)
...
Рейтинг: 0 / 0
21.02.2020, 00:53
    #39929237
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
SY

Я уже показал как допилить твое решение.
SY.

да, спасибо.
мне казалось, что должно быть достаточно двух группировок, а получается три.
(2 + дистинкт)
вот еще один три-вариант.
вроде похож на правду:

Код: 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.
with tab1(a, b,c,d) as
(
Select 1, 'A', 'T', 1 From dual union all
Select 1, 'A', 'S', 2 From dual union all
Select 1, 'A', 'H', 3 From dual union all 
select 1, 'X', 'X' , 4 from dual union all
----
Select 3, 'A', 'T', 1 From dual union all
Select 3, 'A', 'S', 2 From dual union all
Select 3, 'A', 'H', 3 From dual union all 
select 3, 'Y', 'Y', 4 from dual union all
----
select 2 a,'A' b,'T' c,1 d from dual union all
select 2 a,'A' b,'S' c,2 d from dual union all
select 2 a,'A' b,'H' c,3 d from dual union all
select 5 a,'A' b,'T' c,1 d from dual union all
select 5 a,'A' b,'S' c,2 d from dual union all
select 5 a,'A' b,'H' c,3 d from dual
)
, tc as (
  Select 
   count(*) over(partition by a) as cnt
   , tab1.*
  from tab1
)
select a 
from (
  select tc.a, tc.cnt 
  from tc
  intersect
  select t1.a, count(*) over(partition by t1.a, t2.a) as cnt
  from tc t1 join tc t2
       on t1.cnt = t2.cnt
       and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
)
;

...
Рейтинг: 0 / 0
21.02.2020, 01:32
    #39929243
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
booby,
нашлась пропажа в две группировки:

Код: 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.
with tab1(a, b,c,d) as
(
select 1, 'A', 'T', 1 From dual union all
select 1, 'A', 'S', 2 From dual union all
select 1, 'A', 'H', 3 From dual union all 
select 1, 'X', 'X' , 4 from dual union all
----
select 3, 'A', 'T', 1 From dual union all
select 3, 'A', 'S', 2 From dual union all
select 3, 'A', 'H', 3 From dual union all 
select 3, 'Y', 'Y', 4 from dual union all
----
select 2 a,'A' b,'T' c,1 d from dual union all
select 2 a,'A' b,'S' c,2 d from dual union all
select 2 a,'A' b,'H' c,3 d from dual union all
select 5 a,'A' b,'T' c,1 d from dual union all
select 5 a,'A' b,'S' c,2 d from dual union all
select 5 a,'A' b,'H' c,3 d from dual
)
, tc as (
  select 
   a, Count(*) as cnt
  from tab1
  group by a
)
  select tc.a 
  from tc
  where Exists(
    select Null 
    from tab1 t1 join tab1 t2
         on 1 = 1 
         and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
    where t1.a = tc.a
    group by t1.a, t2.a
    having Count(*) = tc.cnt
       )
  order by a
;

...
Рейтинг: 0 / 0
21.02.2020, 10:04
    #39929307
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
booby,

как определить кто с кем в паре(группе)?
Код: 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.
52.
53.
54.
55.
56.
57.
58.
SQL> ed
Wrote file afiedt.buf

  1  with tab1(a, b,c,d) as
  2  (
  3  select 1, 'A', 'T', 1 From dual union all
  4  select 1, 'A', 'S', 2 From dual union all
  5  select 1, 'A', 'H', 3 From dual union all
  6  select 1, 'X', 'X' , 4 from dual union all
  7  ----
  8  select 3, 'A', 'T', 1 From dual union all
  9  select 3, 'A', 'S', 2 From dual union all
 10  select 3, 'A', 'H', 3 From dual union all
 11  select 3, 'Y', 'Y', 4 from dual union all
 12  ---
 13  select 4, 'A', 'H', 3 From dual union all
 14  select 4, 'X', 'X' , 4 from dual union all
 15  --
 16  select 6, 'A', 'H', 3 From dual union all
 17  select 6, 'X', 'X' , 4 from dual union all
 18  --
 19  select 7, 'A', 'H', 3 From dual union all
 20  select 7, 'X', 'X' , 4 from dual union all
 21  ----
 22  select 2 a,'A' b,'T' c,1 d from dual union all
 23  select 2 a,'A' b,'S' c,2 d from dual union all
 24  select 2 a,'A' b,'H' c,3 d from dual union all
 25  select 5 a,'A' b,'T' c,1 d from dual union all
 26  select 5 a,'A' b,'S' c,2 d from dual union all
 27  select 5 a,'A' b,'H' c,3 d from dual
 28  )
 29  , tc as (
 30    select
 31     a, Count(*) as cnt
 32    from tab1
 33    group by a
 34  )
 35    select tc.a
 36    from tc
 37    where Exists(
 38      select Null
 39      from tab1 t1 join tab1 t2
 40           on 1 = 1
 41           and t1.a != t2.a and t1.b=t2.b and t1.c = t2.c and t1.d = t2.d
 42      where t1.a = tc.a
 43      group by t1.a, t2.a
 44      having Count(*) = tc.cnt
 45         )
 46*   order by a
 47  /

         A
----------
         2
         4
         5
         6
         7



.....
stax
...
Рейтинг: 0 / 0
21.02.2020, 10:37
    #39929327
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Код: 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 tab1(a, b,c,d) as
(
select 1, 'A', 'T', '1' From dual union all
select 1, 'A', 'S', '2' From dual union all
select 1, 'A', 'H', '3' From dual union all
select 1, 'X', 'X' , '4' from dual union all
----
select 3, 'A', 'T', '1' From dual union all
select 3, 'A', 'S', '2' From dual union all
select 3, 'A', 'H', '3' From dual union all
select 3, 'Y', 'Y', '4' from dual union all
---
select 4, 'A', 'H', '3' From dual union all
select 4, 'X', 'X' , '4' from dual union all
--
select 6, 'A', 'H', '3' From dual union all
select 6, 'X', 'X' , '4' from dual union all
--
select 7, 'A', 'H', '3' From dual union all
select 7, 'X', 'X' , '4' from dual union all
----
select 2 a,'A' b,'T' c,'1' d from dual union all
select 2 a,'A' b,'S' c,'2' d from dual union all
select 2 a,'A' b,'H' c,'3' d from dual union all
select 5 a,'A' b,'T' c,'1' d from dual union all
select 5 a,'A' b,'S' c,'2' d from dual union all
select 5 a,'A' b,'H' c,'3' d from dual
)
, t as (select a, listagg(nvl(b,'WTF')||nvl(c,'WTF')||nvl(d,'WTF'),';') WITHIN GROUP (order by b, c, d) as agg from tab1
group by a)

select a from t t1
where exists (select 1 from t t2 where t1.agg=t2.agg and t1.a != t2.a)
order by agg, a
...
Рейтинг: 0 / 0
21.02.2020, 12:23
    #39929389
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Stax,

Staxкак определить кто с кем в паре(группе)?
необходимый вывод определен в первом посте.
Ты формулируешь другую задачу.
для неё надо превратить полусоединение (exist) в явное соединение, например боковое (lateral)
и брать пары из того join-а, который в exist
...
Рейтинг: 0 / 0
21.02.2020, 12:41
    #39929411
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
booby
Stax,

Staxкак определить кто с кем в паре(группе)?

необходимый вывод определен в первом посте.
Ты формулируешь другую задачу.
и брать пары из того join-а, который в exist
імхо
нет не "формулируешь другую задачу"
первом посте цвет - ето группа

.....
stax
...
Рейтинг: 0 / 0
21.02.2020, 13:45
    #39929450
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Stax
booby
Stax,

пропущено...

необходимый вывод определен в первом посте.
Ты формулируешь другую задачу.
и брать пары из того join-а, который в exist

імхо
нет не "формулируешь другую задачу"
первом посте цвет - ето группа

.....
stax

надо подумать, как номер признака связности добавить.
но не сегодня - я уже весть в коньяке, пиве и шампанском (входим в длинные праздники).
Пока кажется, что его надо на union-е от соединения строить, как точно - пока не знаю.
...
Рейтинг: 0 / 0
21.02.2020, 14:02
    #39929468
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
booby

надо подумать, как номер признака связности добавить.
но не сегодня - я уже весть в коньяке, пиве и шампанском (входим в длинные праздники).
Пока кажется, что его надо на union-е от соединения строить, как точно - пока не знаю.

99% на форуме такую задачу уже решали (лень искать)

.....
stax
...
Рейтинг: 0 / 0
21.02.2020, 14:40
    #39929500
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
andrey_anonymous
Stax
можно listaag и раздельно для каждого поля

Можн listagg от
Код: plsql
1.
dense_rank() over(order by b,c,d)



Так больше поместится :)
интересно, почему все это проигнорировали? Даже если не для обхода проблемы длины, то хотя бы для удобства - с числом то легче и приятнее работать, чем с кучей полей.

еще один простенький вариант без ограничения на кол-во
Код: 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.
with tab1(a, b,c,d) as
(
select 1, 'A', 'T', '1' From dual union all
select 1, 'A', 'S', '2' From dual union all
select 1, 'A', 'H', '3' From dual union all
select 1, 'X', 'X' , '4' from dual union all
----
select 3, 'A', 'T', '1' From dual union all
select 3, 'A', 'S', '2' From dual union all
select 3, 'A', 'H', '3' From dual union all
select 3, 'Y', 'Y', '4' from dual union all
---
select 4, 'A', 'H', '3' From dual union all
select 4, 'X', 'X' , '4' from dual union all
--
select 6, 'A', 'H', '3' From dual union all
select 6, 'X', 'X' , '4' from dual union all
--
select 7, 'A', 'H', '3' From dual union all
select 7, 'X', 'X' , '4' from dual union all
----
select 2 a,'A' b,'T' c,'1' d from dual union all
select 2 a,'A' b,'S' c,'2' d from dual union all
select 2 a,'A' b,'H' c,'3' d from dual union all
select 5 a,'A' b,'T' c,'1' d from dual union all
select 5 a,'A' b,'S' c,'2' d from dual union all
select 5 a,'A' b,'H' c,'3' d from dual
)
, bcd_group as (
     select 
        a, 
        dense_rank()over(order by b,c,d) grp,
        count(*) over(partition by a) cnt
     from tab1
)
select distinct a
from (
     select
        g1.a a1,
        g2.a a2
     from bcd_group g1
         ,bcd_group g2
     where g2.a>g1.a
       and g1.cnt=g2.cnt
       and g1.grp=g2.grp
     group by g1.a,g2.a,g2.cnt
     having g2.cnt=count(*)
)
unpivot (a for p in (a1, a2))

...
Рейтинг: 0 / 0
21.02.2020, 14:40
    #39929501
Tom333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Ох, ничего себе понаписали пока меня не было :)
Maxim Demenko, SY, booby, Stax, andrey_anonymous, Dshedoo, спасибо большое за советы!
Вчера по совету Stax засел разбираться с LISTAGG WITHIN GROUP и в итоге с использованием конкатенации наваял нечто похожее на то, что предложил Максим только без вывода строк, у которых не нашлось дубликатов.
C union идею тоже понял, спасибо, но не способен пока поместить её в котелок и осознать логику :)
Всех с Наступающим, кстати, и отличных выходных!
...
Рейтинг: 0 / 0
21.02.2020, 15:01
    #39929519
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
xtender,

как понять кто в какой группе?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> /

         A
----------
         6
         2
         5
         4
         7



22083974
надо "раскрасить" 1,3 желтые, 4,6 синие і тд

.....
stax
...
Рейтинг: 0 / 0
21.02.2020, 15:15
    #39929530
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
Stax,

Ну это же элементарно. Взгляни на запрос - надо лишь убрать unpivot и все станет ясно
...
Рейтинг: 0 / 0
21.02.2020, 15:48
    #39929552
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Комплексная группировка значений
xtender
Stax,

Ну это же элементарно. Взгляни на запрос - надо лишь убрать unpivot и все станет ясно


оно то ясно, но не совсем наглядно
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
with tab1(a, b,c,d) as
(
select 1, 'A', 'T', '1' From dual union all
select 1, 'A', 'S', '2' From dual union all
select 1, 'A', 'H', '3' From dual union all
select 1, 'X', 'X' , '4' from dual union all
----
select 3, 'A', 'T', '1' From dual union all
select 3, 'A', 'S', '2' From dual union all
select 3, 'A', 'H', '3' From dual union all
---
select 4, 'A', 'H', '3' From dual union all
select 4, 'X', 'X' , '4' from dual union all
--
select 6, 'A', 'H', '3' From dual union all
select 6, 'X', 'X' , '4' from dual union all
--
select 7, 'A', 'H', '3' From dual union all
select 7, 'X', 'X' , '4' from dual union all
--
select 8, 'A', 'H', '3' From dual union all
select 8, 'X', 'X' , '4' from dual union all
----
select 10, 'A', 'H', '1' From dual union all
select 10, 'X', 'X' , '2' from dual union all
--
select 11, 'A', 'H', '1' From dual union all
select 11, 'X', 'X' , '3' from dual union all
----
select 12, 'A', 'H', '1' From dual union all
select 12, 'X', 'X' , '4' from dual union all
--
select 2 a,'A' b,'T' c,'1' d from dual union all
select 2 a,'A' b,'S' c,'2' d from dual union all
select 2 a,'A' b,'H' c,'3' d from dual union all
--
select 5 a,'A' b,'T' c,'1' d from dual union all
select 5 a,'A' b,'S' c,'2' d from dual union all
select 5 a,'A' b,'H' c,'3' d from dual
)
, bcd_group as (
     select 
        a, 
        dense_rank()over(order by b,c,d) grp,
        count(*) over(partition by a) cnt
     from tab1
)
select distinct a1,a2
from (
     select
        g1.a a1,
        g2.a a2
     from bcd_group g1
         ,bcd_group g2
     where g2.a>g1.a
       and g1.cnt=g2.cnt
       and g1.grp=g2.grp
     group by g1.a,g2.a,g2.cnt
     having g2.cnt=count(*)
)
--unpivot (a for p in (a1, a2))
/
SQL> /

        A1         A2
---------- ----------
         7          8
         2          5
         2          3
         4          6
         3          5
         4          8
         6          8
         4          7
         6          7

9 rows selected.



зи
решение красивое

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


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