powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Комплексная группировка значений
12 сообщений из 37, страница 2 из 2
Комплексная группировка значений
    #39929562
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
бог с ней, с отсутствуюшей восьмеркой слева,
но ты уж определись - видно ли в нём тебе, что 4, 6 и 7 одного цвета
а так-то оно и "элементарно" и "всем понятно".
...
легко ты ведёшься на "красивые решения".
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929571
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
оно то ясно, но не совсем наглядно

Что мешает дополнить unpivot, к примеру, номером строки?
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929577
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Stax,
бог с ней, с отсутствуюшей восьмеркой слева,
но ты уж определись - видно ли в нём тебе, что 4, 6 и 7 одного цвета
а так-то оно и "элементарно" и "всем понятно".
...
легко ты ведёшься на "красивые решения".


4, 6,7 и 8

я ж написал ненаглядно

если присмотрется то видно + можно заменить на >= (появлятся сироты которых нет в исходке)

імхо
сама идея интересна/ценна (отсюда красивое)
dense_rank()over(order by b,c,d) grp
ето сведение совпадения по трех (мож и больше) полях к одному полю (rank)

если б в задаче на совпадение было одно поле (напр b) то dense_rank не нужен
и такая задачка 99% решалась на форуме

зи
не знаю кто менее прожорлив dense_rank()over или rank()over

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

Что мешает дополнить unpivot, к примеру, номером строки?


ума не хватает вот так сразу взять и добавить, куда/как?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select distinct 
     a
--    ,rn
from (
     select  --rownum rn,
        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))
/



.....
stax
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929612
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
create or replace
  type NumList
    as table of number
/
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 NumList(a1) multiset union all cast(collect(a2) as NumList) same_color
from (
     select
        g1.a a1,
        g2.a a2,
        row_number() over(partition by g2.a order by g1.a) rn
     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(*)
)
where rn = 1
group by a1
/

SAME_COLOR
--------------------------------------------------------------------------------
NUMLIST(2, 5)
NUMLIST(4, 6, 7)

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

по опознанной Stax-ом формулировке это чистый, 100%-ый union-find on sql
здесь, по формулировке, нужен"просто" номер цвета, а не место для тырцканья пальцем,
вопроса "видишь?" не подразумевается.
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929622
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

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

то есть, не нум_лист, а его номер рядом с a


Поле same_color показывает что раскрасить одной краской. Ну добaвь row_number и создай палитру:

Код: 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.
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
)
, t as (
select row_number() over(order by a1) color_id,
       NumList(a1) multiset union all cast(collect(a2) as NumList) same_color
from (
     select
        g1.a a1,
        g2.a a2,
        row_number() over(partition by g2.a order by g1.a) rn
     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(*)
)
where rn = 1
group by a1
)
,colors as (
           select 1 id, 'RED' color from dual union all
           select 2,'GREEN' from dual
          )
select  same_color,color
  from  t,
        colors
  where color_id = id
/

SAME_COLOR           COLOR
-------------------- -----
NUMLIST(2, 5)        RED
NUMLIST(4, 6, 7)     GREEN

SQL>



SY.
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929633
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Жесть... элементарно же: убрать unpivot и сделать select min(a1), a2 from... group by a2. Первое будет и названием группы и первым её элементом, а2 - остальными.
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929636
Фотография 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.
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.
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
)
, t as (
select row_number() over(order by a1) color_id,
       NumList(a1) multiset union distinct cast(collect(a2) as NumList) same_color
from (
     select
        g1.a a1,
        g2.a a2,
        row_number() over(partition by g2.a order by g1.a) rn
     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(*)
)
where rn = 1
group by a1
)
,colors as (
           select 1 id, 'RED' color from dual union all
           select 2,'GREEN' from dual union all
           select 3,'BLUE' from dual union all
           select 4,'PINK' from dual
          )
select  same_color,color
  from  t,
        colors
  where color_id = id
/

SAME_COLOR           COLOR
-------------------- -----
NUMLIST(1)           RED
NUMLIST(2, 5)        GREEN
NUMLIST(3)           BLUE
NUMLIST(4, 7, 6)     PINK

SQL>



SY.
...
Рейтинг: 0 / 0
Комплексная группировка значений
    #39929640
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Жесть... элементарно же: убрать unpivot и сделать select min(a1), a2 from... group by a2. Первое будет и названием группы и первым её элементом, а2 - остальными.


Можно, но группы будут разбросаны ипо строкам и по полям. Т.e. получим что-то типа:

Код: 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 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
),
t as (
select  min(a1) a1, a2,
        dense_rank() over(order by min(a1)) color_id
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(*)
)
group by a2
),
colors as (
           select 1 id, 'RED' color from dual union all
           select 2,'GREEN' from dual union all
           select 3,'BLUE' from dual union all
           select 4,'PINK' from dual
          )
select  a1,a2,color
  from  t,
        colors
  where color_id = id
/

        A1         A2 COLOR
---------- ---------- -----
         1          1 RED
         2          5 GREEN
         2          2 GREEN
         3          3 BLUE
         4          7 PINK
         4          6 PINK
         4          4 PINK

7 rows selected.

SQL>



Не шашечки...

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

выглядит как раз как вполне шашечки.
Результат правильный для этого набора, a1 и color по смыслу дублируют друг-друга.
на этом можно строить ответ на вопрос - одного ли цвета 4 и 7,
и есть ли кто-то одного цвета с 3.
в твоем варианте последнего разворота множества не хватает
для построения затребованного результата,
как-то так:

Код: 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.
create or replace
  type NumList
    as table of number
/
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
)
, t as (
select row_number() over(order by a1) color_id,
       NumList(a1) multiset union distinct cast(collect(a2) as NumList) same_color
from (
     select
        g1.a a1,
        g2.a a2,
        row_number() over(partition by g2.a order by g1.a) rn
     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(*)
)
where rn = 1
group by a1
)
,colors as (
           select 1 id, 'RED' color from dual union all
           select 2,'GREEN' from dual union all
           select 3,'BLUE' from dual union all
           select 4,'PINK' from dual
          )
, t_sets as (select  same_color,color
  from  t,
        colors
  where color_id = id
  )
select b.column_value as a, t_sets.color
from t_sets, Table(cast( t_sets.same_color as NumList))  b
/

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


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