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

Результат:

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

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

.....
stax
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929048
Tom333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, спасибо! У меня была вторая идея склеить их в одно, а потом сравнивать полученные значения, в varchar2 поместится с головой. Но не могу сообразить как сделать чтобы сначала выстроить по алфавиту, потом склеить, а потом выполнить сравнение.
Потому что если склеить AT1+AS2+AH3, а в другом случае AS2+AT1+AH3, то результат сравнения будет не удовлетворительный.
Неудобно просить, но буду благодарен если найдете время накидать основу скрипта. Сейчас пробую сам наваять, но пока выходит не очень :)
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #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
Комплексная группировка значений
    #39929070
Фотография 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
Комплексная группировка значений
    #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
Комплексная группировка значений
    #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
Комплексная группировка значений
    #39929087
Фотография 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
Комплексная группировка значений
    #39929097
Фотография 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
Комплексная группировка значений
    #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
Комплексная группировка значений
    #39929119
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, не видел 22084054

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

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


Так больше поместится :)
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #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
Комплексная группировка значений
    #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
Комплексная группировка значений
    #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
Комплексная группировка значений
    #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
Комплексная группировка значений
    #39929389
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

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

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

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

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

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

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

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

.....
stax

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #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
Комплексная группировка значений
    #39929501
Tom333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох, ничего себе понаписали пока меня не было :)
Maxim Demenko, SY, booby, Stax, andrey_anonymous, Dshedoo, спасибо большое за советы!
Вчера по совету Stax засел разбираться с LISTAGG WITHIN GROUP и в итоге с использованием конкатенации наваял нечто похожее на то, что предложил Максим только без вывода строк, у которых не нашлось дубликатов.
C union идею тоже понял, спасибо, но не способен пока поместить её в котелок и осознать логику :)
Всех с Наступающим, кстати, и отличных выходных!
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #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
Комплексная группировка значений
    #39929530
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Stax,

Ну это же элементарно. Взгляни на запрос - надо лишь убрать unpivot и все станет ясно
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #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
25 сообщений из 37, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Комплексная группировка значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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