powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка в Oracle
14 сообщений из 39, страница 2 из 2
Группировка в Oracle
    #39635041
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousКомбинаторику-то не обманешь, это правда, но зачем же стулья ломать? :)
...что-то подозревать я начал на тесте с mod(rownum,1000) - т.е. по сотне значений на id, это ведь "в пределах", да?
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39635049
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Код: plsql
1.
2.
3.
40 rows selected.

Elapsed: 00:00:00.54



Комбинаторику-то не обманешь, это правда, но зачем же стулья ломать? :)

Не понял с какого перепугу "40 rows selected". Select должен вернуть 699993 строк:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select count(*) from dropme_t
  2  /

  COUNT(*)
----------
    699993

SQL> 



SY.
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39635050
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНе понял с какого перепугу "40 rows selected". Select должен вернуть 699993 строк:


Упс, пора перечитывать условия опять.

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


Похоже Андрей слепил "магию данных". Исходя из примера я решил что значения C2 - C6 уникальны a он слепил тест с повторяющимися значениями и скорее всего просто всунул DISTINCT в 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.
with   t as (
             select  c1,
                     collect(distinct c2) c2,
                     collect(distinct c3) c3,
                     collect(distinct c4) c4,
                     collect(distinct c5) c5,
                     collect(distinct c6) c6
               from  dropme_t
               group by c1
            )
select  c1,
        t2.column_value c2,
        t3.column_value c3,
        t4.column_value c4,
        t5.column_value c5,
        t6.column_value c6
  from  t,
        table(c2) t2,
        table(c3) t3,
        table(c4) t4,
        table(c5) t5,
        table(c6) t6
  order by c1,
           c2,
           c3,
           c4,
           c5,
           c6
/
...

40 rows selected.

Elapsed: 00:00:00.51
SQL> 



SY.
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39635061
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYПохоже Андрей слепил "магию данных".
Не магию.
Контрпример.
Собственно, я зацепился глазом за эту тему, когда увидел решение агрегатной задачи на аналитике-фильтрации.
Затем - комментарий к решению на агрегате "искусство ради искусства".
Мои тараканы устроили митинг, на котором дружно заявили о недооценке спецэффектов, проистекающих от перерасхода памяти под промежуточные наборы данных (что весьма характерно для "аналитического" подхода к задаче агрегации).
Я устроил тараканам репрессии и от комментариев удержался.
Но тут влез Fogel и стало совсем смешно.
Как итог - я построил демонстрационный контр-пример, просто слегка размножив исходный набор.
Следует отметить, что эффект превзошел мои самые смелые ожидания.
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39635076
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousСледует отметить, что эффект превзошел мои самые смелые ожидания.

Ну а я просто вижу эффект неполного определения условий задачи. Тут важное значение имеет уникальны ли c2 - c6.

SY.
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39635080
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYТут важное значение имеет уникальны ли c2 - c6.


Поясню:

Код: 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.
SQL> explain plan for
  2  select  c1,
  3          c2,
  4          collect(c3) over(partition by c1) c3,
  5          collect(c4) over(partition by c1) c4,
  6          collect(c5) over(partition by c1) c5,
  7          collect(c6) over(partition by c1) c6
  8    from  dropme_t
  9  /

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 3964081274

---------------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |   699K|  6835K|       |  3149   (2)| 00:00:01 |
|   1 |  WINDOW SORT       |          |   699K|  6835K|    18M|  3149   (2)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DROPME_T |   699K|  6835K|       |   345   (3)| 00:00:01 |
---------------------------------------------------------------------------------------

9 rows selected.

SQL> explain plan for
  2  select  c1,
  3          c2,
  4          collect(distinct c3) over(partition by c1) c3,
  5          collect(distinct c4) over(partition by c1) c4,
  6          collect(distinct c5) over(partition by c1) c5,
  7          collect(distinct c6) over(partition by c1) c6
  8    from  dropme_t
  9  /

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 2807215000

------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |   699K|  6835K|       | 11561   (2)| 00:00:01 |
|   1 |  WINDOW SORT          |          |   699K|  6835K|    18M| 11561   (2)| 00:00:01 |
|   2 |   WINDOW SORT         |          |   699K|  6835K|    18M| 11561   (2)| 00:00:01 |
|   3 |    WINDOW SORT        |          |   699K|  6835K|    18M| 11561   (2)| 00:00:01 |
|   4 |     WINDOW SORT       |          |   699K|  6835K|    18M| 11561   (2)| 00:00:01 |
|   5 |      TABLE ACCESS FULL| DROPME_T |   699K|  6835K|       |   345   (3)| 00:00:01 |

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------

12 rows selected.

SQL> 



А вот агрегация c DISTINCT "умнее":

Код: 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.
SQL> explain plan for
  2  select  c1,
  3          collect(distinct c2) c2,
  4          collect(distinct c3) c3,
  5          collect(distinct c4) c4,
  6          collect(distinct c5) c5,
  7          collect(distinct c6) c6
  8    from  dropme_t
  9    group by c1
 10  /

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 530221137

-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |    10 |   100 |   371  (10)| 00:00:01 |
|   1 |  SORT GROUP BY     |          |    10 |   100 |   371  (10)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DROPME_T |   699K|  6835K|   345   (3)| 00:00:01 |
-------------------------------------------------------------------------------

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39636822
DenFrost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Прошу совета как сделать, чтобы не плодить темы, решил написать здесь. Мне нужно сделать группировку.

дано

select null id, 32 d_id, 71 sn from dual
union
select null id, 62 d_id, 56 sn from dual
union
select 7 id, 62 d_id, 60 sn from dual
union
select null id, 60 d_id, 41 sn from dual
union
select null id, 82 d_id, 1 sn from dual
union
select 10 id, 82 d_id, 2 sn from dual
union
select 15 id, 82 d_id, 3 sn from dual

нужно вывести
id d_id sn
null 32 71
7 62 60
null 60 41
15 82 3

Заранее спасибо за ответ.

P.S. Нужно использовать аналитику?
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39636830
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
with дано as (
select null id, 32 d_id, 71 sn from dual
union
select null id, 62 d_id, 56 sn from dual
union
select 7 id, 62 d_id, 60 sn from dual
union
select null id, 60 d_id, 41 sn from dual
union
select null id, 82 d_id, 1 sn from dual
union
select 10 id, 82 d_id, 2 sn from dual
union
select 15 id, 82 d_id, 3 sn from dual
),
"нужно вывести"(id, d_id, sn) as (
select null, 32, 71 from dual
union
select 7, 62, 60 from dual
union
select null, 60, 41 from dual
union
select 15, 82, 3 from dual
)
select * from "нужно вывести"
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39636845
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр,

Открой свою тему. Незачем "уводить" (не нашел лучшего перевода для hijack) чужую.

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

Открой свою тему. Незачем "уводить" (не нашел лучшего перевода для hijack) чужую.

SY.Вообще-то я товарищу DenFrost ответил
DenFrost Добрый день. Прошу совета как сделать, чтобы не плодить темы, решил написать здесь. Мне нужно сделать группировку.
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39636948
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenFrost,

а что не получается?
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  select null id, 32 d_id, 71 sn from dual
  3  union all
  4  select null id, 62 d_id, 56 sn from dual
  5  union all
  6  select 7 id, 62 d_id, 60 sn from dual
  7  union all
  8  select null id, 60 d_id, 41 sn from dual
  9  union all
 10  select null id, 82 d_id, 1 sn from dual
 11  union all
 12  select 10 id, 82 d_id, 2 sn from dual
 13  union all
 14  select 15 id, 82 d_id, 3 sn from dual
 15  ),
 16  n(id, d_id, sn) as (
 17  select null, 32, 71 from dual
 18  union all
 19  select 7, 62, 60 from dual
 20  union all
 21  select null, 60, 41 from dual
 22  union all
 23  select 15, 82, 3 from dual
 24  )
 25  select max(id) id,d_id,max(sn) sn from n
 26* group by d_id
SQL> /

        ID       D_ID         SN
---------- ---------- ----------
                   32         71
         7         62         60
                   60         41
        15         82          3



....
stax
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39637100
DenFrost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я наверное чуток не дописал,
вывести строчки с максимальным id по d_id и также строчки с id is null

дано
id d_id sn 3271 625676254 60 41 82110821115828

получить
id d_id sn 327176254 60 4115828
...
Рейтинг: 0 / 0
Группировка в Oracle
    #39637107
DenFrost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я придумал такой вариант, может есть проще

select * from (
select
a.*
, nvl(max (id) over (partition by d_id order by id desc nulls last), 0) max_id
from (
select null id, 32 d_id, 71 sn from dual
union
select null id, 62 d_id, 56 sn from dual
union
select 15 id, 82 d_id, 8 sn from dual
union
select 7 id, 62 d_id, 54 sn from dual
union
select null id, 60 d_id, 41 sn from dual
union
select null id, 82 d_id, 0 sn from dual
union
select 10 id, 82 d_id, 11 sn from dual
) a
)
where id = max_id or max_id = 0
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка в Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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