powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задача: single from
35 сообщений из 35, показаны все 2 страниц
Пятничная задача: single from
    #40131814
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица с координатами точек.

Найти
1. Количество точек в диапазоне +-2 по абсциссе и ординате для каждой точки.
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
SQL> select t.*,
  2         (select count(*)
  3          from points
  4          where x between t.x - 2 and t.x + 2 and y between t.y - 2 and t.y + 2) cnt
  5  from points t;

        ID          X          Y        CNT
---------- ---------- ---------- ----------
         1          1          1          5
         2          2          2         10
         3          3          1         10
         4          3          2         13
         5          3          3         15
         6          3          4         12
         7          4          1         10
         8          4          2         14
         9          4          3         16
        10          4          4         14
        11          4          5         10
        12          5          2         13
        13          5          3         15
        14          5          4         13
        15          5          5         10
        16          6          3         11
        17          6          4         10

17 rows selected.

SQL>
SQL> select t.*, (select sum(sqrt(power(x - t.x, 2) + power(y - t.y, 2))) from points) dist
  2  from points t;

        ID          X          Y       DIST
---------- ---------- ---------- ----------
         1          1          1 61.5629421
         2          2          2 42.9905342
         3          3          1 42.3402527
         4          3          2 33.9007161
         5          3          3 32.0060445
         6          3          4 36.5312328
         7          4          1 40.4182704
         8          4          2 31.1038271
         9          4          3 28.2066774
        10          4          4 32.1841901
        11          4          5 42.4182704
        12          5          2  35.300723
        13          5          3 31.6497533
        14          5          4  34.916584
        15          5          5 44.6276236
        16          6          3 41.6318623
        17          6          4 44.2841669

17 rows selected.



Фишка в том, что в решении слово from может втречаться только один раз .

данные
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create table points as
select rownum id, x, y
from
(
select 1 x, 1 y from dual
union all select 2 x, 2 y from dual
union all select 3 x, 1 y from dual
union all select 3 x, 2 y from dual
union all select 3 x, 3 y from dual
union all select 3 x, 4 y from dual
union all select 4 x, 1 y from dual
union all select 4 x, 2 y from dual
union all select 4 x, 3 y from dual
union all select 4 x, 4 y from dual
union all select 4 x, 5 y from dual
union all select 5 x, 2 y from dual
union all select 5 x, 3 y from dual
union all select 5 x, 4 y from dual
union all select 5 x, 5 y from dual
union all select 6 x, 3 y from dual
union all select 6 x, 4 y from dual
);


PS. Принципиально разных решений несколько.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131821
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
from может втречаться только один раз .
left join, но что-то как-то неспортивно уточни условия
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131822
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov,

Без join в любом виде, без inline view и без подзапросов.

PS. Да уж, хотел изначально сформулировать покороче...

PPS. Вероятно формулровка может быть еще такая: план запроса представляет собой не дерево а список. :)
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131823
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Без join в любом виде, без inline view и без подзапросов.
То есть и без второго упоминания таблицы points тоже - типа такого:
Код: plsql
1.
{что угодно, кроме слов from и points} from points {что угодно, кроме слов from и points} 



Выбор-то небольшой остается - connect by и pivot
P. S. Можно ли решать задачу "графически"?
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131824
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ограничение описать кратко и абсолютно строго (как мне кажется), но если это сделать, то это будет подсказкой.

Хотя это сообщение уже само по себе в некоторой мере является подсказкой. Почти как Cheryl's Birthday
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131827
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никанор Кузьмич
dbms_photoshop
Без join в любом виде, без inline view и без подзапросов.
То есть и без второго упоминания таблицы points тоже - типа такого:
Код: plsql
1.
{что угодно, кроме слов from и points} from points {что угодно, кроме слов from и points} 


Типа да.
Строгая формулировка ограничения она же частично подсказка в спойлере.
В запросе может фигурировать только одно table_reference

Никанор Кузьмич
Выбор-то небольшой остается - connect by и pivot
Диалект Оракла побогаче будет.
Никанор Кузьмич
P. S. Можно ли решать задачу "графически"?
А это как? Если что, число точек абсолютно призвольное так же как и их координаты (то есть не обязательно целочисленные как в примере).
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131833
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
Почти как Cheryl's Birthday
ура, решил! Я еще что-то могу!
dbms_photoshop
подсказкой
я, видимо, упустил что-то между строк, но пока кроме модели (легко) и connect-by ничего элегантного не придумывается...
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131834
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov,

Есть еще кроме озвученного тобой в спойлере.

Публикуй что есть, подходов хватает. Всем хватит подумать.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131836
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Никанор Кузьмич
P. S. Можно ли решать задачу "графически"?
А это как? Если что, число точек абсолютно призвольное так же как и их координаты (то есть не обязательно целочисленные как в примере).
Вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select x, decode("1", 0, null, '.') y1, decode("2", 0, null, '.') y2, decode("3", 0, null, '.') y3, decode("4", 0, null, '.') y4, decode("5", 0, null, '.') y5 
  from points
 pivot(count(*) for y in (1, 2, 3, 4, 5))
 order by 1;

X Y1  Y2  Y3  Y4  Y5
---------------------------
1  .	 	 	 	 
2      .	 	 	 
3  .   .   .   .	 
4  .   .   .   .   .
5      .   .   .   .
6          .   .	 

Вот вам точки, где там +/- 2 единицы от каждой, видно на глаз Как расстояния посчитать, не придумал пока.
Надо кому-то объяснять, что это шутка, или все уже сами догадались?
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131837
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузьмич, а ты тот еще остряк.

PS. На самом деле я собирался сгенерировать на питоне красивую картинку с точками для стартового поста,
но у меня на компе не нашлось нужной библиотеки и я испугался что не успею это сделать до конца пятницы по Москве.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131844
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума

вроде пришла идея, но что-то не выходит каменный цветочек - какого-то хрена в xmlagg собираются не все... мозги уже не варят...
если убрать фильтр на значения в TST можно увидеть что для 2,2 например, не включаются значения с Ч=4: должно быть 1,2,1,2,3,4,1,2,3,4, но последних четырех значений какого-то черта нет... то ли баг, то ли я где протупил...
короче, кто сможет - разберитесь. я уж завтра-послезавтра попытаюсь поковырять, когда время найдется
Код: 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 points(ID,X,Y,CNT) as (
select  1, 1, 1,  5 from dual union all
select  2, 2, 2, 10 from dual union all
select  3, 3, 1, 10 from dual union all
select  4, 3, 2, 13 from dual union all
select  5, 3, 3, 15 from dual union all
select  6, 3, 4, 12 from dual union all
select  7, 4, 1, 10 from dual union all
select  8, 4, 2, 14 from dual union all
select  9, 4, 3, 16 from dual union all
select 10, 4, 4, 14 from dual union all
select 11, 4, 5, 10 from dual union all
select 12, 5, 2, 13 from dual union all
select 13, 5, 3, 15 from dual union all
select 14, 5, 4, 13 from dual union all
select 15, 5, 5, 10 from dual union all
select 16, 6, 3, 11 from dual union all
select 17, 6, 4, 10 from dual 
)
select--+ NO_XML_QUERY_REWRITE
    id,x,y,cnt
    ,   xmlquery('$A/R/VAL[ (. >= $B -2) and (. <= $B +2)]'
            passing
                xmlelement("R",
                    (xmlagg(xmlelement(val, y))
                       over(order by x range between 2 preceding and 2 following)
                    )
                ) as A,
                y as B
            returning content
            ) as tst
    ,xmlcast(
        xmlquery('count( $A/R/VAL[ (. >= $B -2) and (. <= $B +2)] )'
            passing
                xmlelement("R",
                    (xmlagg(xmlelement(val, y))
                       over(order by x range between 2 preceding and 2 following)
                    )
                ) as A,
                y as B
            returning content
            )
        as number
        )
     as cnt2
from points;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        ID          X          Y        CNT TST                                                                                                                                                                                                            CNT2
---------- ---------- ---------- ---------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------
         1          1          1          5 <VAL>1</VAL><VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL>                                                                                                                                                      5
         2          2          2         10 <VAL>1</VAL><VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                                                                          6
         3          3          1         10 <VAL>1</VAL><VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL>                                                                                                                                                      5
         4          3          2         13 <VAL>1</VAL><VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                                                                          6
         5          3          3         15 <VAL>1</VAL><VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                                                                          6
         6          3          4         12 <VAL>2</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                                                                                                  4
         7          4          1         10 <VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>2</VAL><VAL>3</VAL><VAL>3</VAL>                                                                                         10
         8          4          2         14 <VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>3</VAL><VAL>4</VAL>                                         14
         9          4          3         16 <VAL>2</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                 16
        10          4          4         14 <VAL>2</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                                         14
        11          4          5         10 <VAL>3</VAL><VAL>4</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                         10
        12          5          2         13 <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>3</VAL><VAL>4</VAL>                                                     13
        13          5          3         15 <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                             15
        14          5          4         13 <VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                                                     13
        15          5          5         10 <VAL>3</VAL><VAL>4</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                         10
        16          6          3         11 <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                                                                             11
        17          6          4         10 <VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>3</VAL><VAL>4</VAL>                                                                                         10

17 rows selected.


...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131877
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov,

Так xmlagg по доке может быть только агрегатной, разве нет?

С уникальным id странность результата сразу видна
Код: plsql
1.
xmlagg(xmlelement(val, id)) over (order by id rows between 2 preceding and 2 following)
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131880
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop

С уникальным id странность результата сразу видна
Код: plsql
1.
xmlagg(xmlelement(val, id)) over (order by id rows between 2 preceding and 2 following)


да явный баг...но только на второй и третьей строчках...странная фигня
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 ID          X          Y        CNT TST2
--- ---------- ---------- ---------- -------------------------------------------------------------------------------
  1          1          1          5 <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL>
  2          2          2         10 <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL>
  3          3          1         10 <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL>
  4          3          2         13 <VAL>2</VAL><VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>6</VAL>
  5          3          3         15 <VAL>3</VAL><VAL>4</VAL><VAL>5</VAL><VAL>6</VAL><VAL>7</VAL>
  6          3          4         12 <VAL>4</VAL><VAL>5</VAL><VAL>6</VAL><VAL>7</VAL><VAL>8</VAL>
  7          4          1         10 <VAL>5</VAL><VAL>6</VAL><VAL>7</VAL><VAL>8</VAL><VAL>9</VAL>
  8          4          2         14 <VAL>6</VAL><VAL>7</VAL><VAL>8</VAL><VAL>9</VAL><VAL>10</VAL>
  9          4          3         16 <VAL>7</VAL><VAL>8</VAL><VAL>9</VAL><VAL>10</VAL><VAL>11</VAL>
 10          4          4         14 <VAL>8</VAL><VAL>9</VAL><VAL>10</VAL><VAL>11</VAL><VAL>12</VAL>
 11          4          5         10 <VAL>9</VAL><VAL>10</VAL><VAL>11</VAL><VAL>12</VAL><VAL>13</VAL>
 12          5          2         13 <VAL>10</VAL><VAL>11</VAL><VAL>12</VAL><VAL>13</VAL><VAL>14</VAL>
 13          5          3         15 <VAL>11</VAL><VAL>12</VAL><VAL>13</VAL><VAL>14</VAL><VAL>15</VAL>
 14          5          4         13 <VAL>12</VAL><VAL>13</VAL><VAL>14</VAL><VAL>15</VAL><VAL>16</VAL>
 15          5          5         10 <VAL>13</VAL><VAL>14</VAL><VAL>15</VAL><VAL>16</VAL><VAL>17</VAL>
 16          6          3         11 <VAL>14</VAL><VAL>15</VAL><VAL>16</VAL><VAL>17</VAL>
 17          6          4         10 <VAL>15</VAL><VAL>16</VAL><VAL>17</VAL>



dbms_photoshop
Так xmlagg по доке может быть только агрегатной, разве нет?

Есть такое: Bug 31613838 - ORA-19214: xmlagg expression is not allowed on 19c (Doc ID 31613838.8)
авторDescription
Re-enable XMLAgg usage as window function


REDISCOVERY INFORMATION:
XMLAgg cannot be used as a window function.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131892
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Воркэраунд, конечно, есть, но какой-то дурацкий: делать только с following и уже их объединять
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.
with points(ID,X,Y,CNT) as (
select  1, 1, 1,  5 from dual union all
select  2, 2, 2, 10 from dual union all
select  3, 3, 1, 10 from dual union all
select  4, 3, 2, 13 from dual union all
select  5, 3, 3, 15 from dual union all
select  6, 3, 4, 12 from dual union all
select  7, 4, 1, 10 from dual union all
select  8, 4, 2, 14 from dual union all
select  9, 4, 3, 16 from dual union all
select 10, 4, 4, 14 from dual union all
select 11, 4, 5, 10 from dual union all
select 12, 5, 2, 13 from dual union all
select 13, 5, 3, 15 from dual union all
select 14, 5, 4, 13 from dual union all
select 15, 5, 5, 10 from dual union all
select 16, 6, 3, 11 from dual union all
select 17, 6, 4, 10 from dual 
)
select--+ NO_XML_QUERY_REWRITE
    id,x,y,cnt
	,xmlagg(xmlelement(val, id)) over (order by id desc rows between current row and 2 following) tst2
    ,xmlagg(xmlelement(val, id)) over (order by id rows between current row and 2 following) tst3
from points
order by id;


results
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 ID          X          Y        CNT TST2                                               TST3
--- ---------- ---------- ---------- -------------------------------------------------- --------------------------------------------------
  1          1          1          5 <VAL>1</VAL>                                       <VAL>1</VAL><VAL>2</VAL><VAL>3</VAL>
  2          2          2         10 <VAL>2</VAL><VAL>1</VAL>                           <VAL>2</VAL><VAL>3</VAL><VAL>4</VAL>
  3          3          1         10 <VAL>3</VAL><VAL>2</VAL><VAL>1</VAL>               <VAL>3</VAL><VAL>4</VAL><VAL>5</VAL>
  4          3          2         13 <VAL>4</VAL><VAL>3</VAL><VAL>2</VAL>               <VAL>4</VAL><VAL>5</VAL><VAL>6</VAL>
  5          3          3         15 <VAL>5</VAL><VAL>4</VAL><VAL>3</VAL>               <VAL>5</VAL><VAL>6</VAL><VAL>7</VAL>
  6          3          4         12 <VAL>6</VAL><VAL>5</VAL><VAL>4</VAL>               <VAL>6</VAL><VAL>7</VAL><VAL>8</VAL>
  7          4          1         10 <VAL>7</VAL><VAL>6</VAL><VAL>5</VAL>               <VAL>7</VAL><VAL>8</VAL><VAL>9</VAL>
  8          4          2         14 <VAL>8</VAL><VAL>7</VAL><VAL>6</VAL>               <VAL>8</VAL><VAL>9</VAL><VAL>10</VAL>
  9          4          3         16 <VAL>9</VAL><VAL>8</VAL><VAL>7</VAL>               <VAL>9</VAL><VAL>10</VAL><VAL>11</VAL>
 10          4          4         14 <VAL>10</VAL><VAL>9</VAL><VAL>8</VAL>              <VAL>10</VAL><VAL>11</VAL><VAL>12</VAL>
 11          4          5         10 <VAL>11</VAL><VAL>10</VAL><VAL>9</VAL>             <VAL>11</VAL><VAL>12</VAL><VAL>13</VAL>
 12          5          2         13 <VAL>12</VAL><VAL>11</VAL><VAL>10</VAL>            <VAL>12</VAL><VAL>13</VAL><VAL>14</VAL>
 13          5          3         15 <VAL>13</VAL><VAL>12</VAL><VAL>11</VAL>            <VAL>13</VAL><VAL>14</VAL><VAL>15</VAL>
 14          5          4         13 <VAL>14</VAL><VAL>13</VAL><VAL>12</VAL>            <VAL>14</VAL><VAL>15</VAL><VAL>16</VAL>
 15          5          5         10 <VAL>15</VAL><VAL>14</VAL><VAL>13</VAL>            <VAL>15</VAL><VAL>16</VAL><VAL>17</VAL>
 16          6          3         11 <VAL>16</VAL><VAL>15</VAL><VAL>14</VAL>            <VAL>16</VAL><VAL>17</VAL>
 17          6          4         10 <VAL>17</VAL><VAL>16</VAL><VAL>15</VAL>            <VAL>17</VAL>

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131968
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
пофиг, упрощаем в лоб: простенький xquery
Код: 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.
with points(ID,X,Y,CNT) as (
select  1, 1, 1,  5 from dual union all
select  2, 2, 2, 10 from dual union all
select  3, 3, 1, 10 from dual union all
select  4, 3, 2, 13 from dual union all
select  5, 3, 3, 15 from dual union all
select  6, 3, 4, 12 from dual union all
select  7, 4, 1, 10 from dual union all
select  8, 4, 2, 14 from dual union all
select  9, 4, 3, 16 from dual union all
select 10, 4, 4, 14 from dual union all
select 11, 4, 5, 10 from dual union all
select 12, 5, 2, 13 from dual union all
select 13, 5, 3, 15 from dual union all
select 14, 5, 4, 13 from dual union all
select 15, 5, 5, 10 from dual union all
select 16, 6, 3, 11 from dual union all
select 17, 6, 4, 10 from dual 
)
select--+ NO_XML_QUERY_REWRITE
    id,x,y,cnt
    ,xmlcast(
        xmlquery('count($D/ROW/VAL[./X >= $X - 2 and ./X <= $X +2 and ./Y >= $Y -2 and ./Y <= $Y +2])'
            passing
                xmlelement("ROW",
                    (xmlagg(xmlelement(val, xmlelement(x,x),xmlelement(y,y)))
                       over()
                    )
                ) as D,
                x as X,
                y as Y
            returning content
            )
        as number
        ) as tst
from points;

        ID          X          Y        CNT        TST
---------- ---------- ---------- ---------- ----------
         1          1          1          5          5
         2          2          2         10         10
         3          3          1         10         10
         4          3          2         13         13
         5          3          3         15         15
         6          3          4         12         12
         7          4          1         10         10
         8          4          2         14         14
         9          4          3         16         16
        10          4          4         14         14
        11          4          5         10         10
        12          5          2         13         13
        13          5          3         15         15
        14          5          4         13         13
        15          5          5         10         10
        16          6          3         11         11
        17          6          4         10         10

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131971
Фотография 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.
23.
24.
25.
26.
27.
28.
with points(ID,X,Y,CNT) as (
select  1, 1, 1,  5 from dual union all
select  2, 2, 2, 10 from dual union all
select  3, 3, 1, 10 from dual union all
select  4, 3, 2, 13 from dual union all
select  5, 3, 3, 15 from dual union all
select  6, 3, 4, 12 from dual union all
select  7, 4, 1, 10 from dual union all
select  8, 4, 2, 14 from dual union all
select  9, 4, 3, 16 from dual union all
select 10, 4, 4, 14 from dual union all
select 11, 4, 5, 10 from dual union all
select 12, 5, 2, 13 from dual union all
select 13, 5, 3, 15 from dual union all
select 14, 5, 4, 13 from dual union all
select 15, 5, 5, 10 from dual union all
select 16, 6, 3, 11 from dual union all
select 17, 6, 4, 10 from dual 
)
select *
from points
model
   dimension by (x,y)
   measures(cnt, 0 as cnt2)
   rules(
      cnt2[any,any] = count(*)[x between cv(x)-2 and cv(x)+2, y between cv(y)-2 and cv(y)+2]
   )
;


...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131972
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
connect-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.
with points(ID,X,Y,CNT) as (
select  1, 1, 1,  5 from dual union all
select  2, 2, 2, 10 from dual union all
select  3, 3, 1, 10 from dual union all
select  4, 3, 2, 13 from dual union all
select  5, 3, 3, 15 from dual union all
select  6, 3, 4, 12 from dual union all
select  7, 4, 1, 10 from dual union all
select  8, 4, 2, 14 from dual union all
select  9, 4, 3, 16 from dual union all
select 10, 4, 4, 14 from dual union all
select 11, 4, 5, 10 from dual union all
select 12, 5, 2, 13 from dual union all
select 13, 5, 3, 15 from dual union all
select 14, 5, 4, 13 from dual union all
select 15, 5, 5, 10 from dual union all
select 16, 6, 3, 11 from dual union all
select 17, 6, 4, 10 from dual 
)
select distinct 
  connect_by_root(id ) id ,
  connect_by_root(x  ) x  ,
  connect_by_root(y  ) y  , 
  connect_by_root(cnt) cnt,
  count(*)over(partition by connect_by_root(id )) cnt2
from points p
connect by nocycle 
   prior id!=id
   and prior x between x-2 and x+2
   and prior y between y-2 and y+2
   and level<=2
order by 1
;

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131978
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
упрощаем в лоб: простенький xquery
На самом деле, весьма креативно. Я в сторону XML не думал.
Только небольшой осадок, что аналитическая версия xmlagg недокументирована.
Вторая задача реализуется лишь заменой xquery.
Код: plsql
1.
2.
        xmlquery('declare function local:dist($x, $x0, $y, $y0) {math:sqrt(($x - $x0)*($x - $x0) + ($y - $y0)*($y - $y0))};
                  sum(for $i in $D/ROW/VAL return <Z>{local:dist($i/X, $X, $i/Y, $Y)}</Z>)'

Вероятно, можно короче записать.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131979
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
элементарная моделька
Элементарная она только для первой задачи.
Для второй задачи нам надо в выражении для агрегата ссылаться на текущую строку из левой части правила что невозможно.
На мой взгляд это решается только итеративной моделью.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131980
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
connect-by в лоб

У меня было так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select max(connect_by_root id) id, max(connect_by_root x) x, max(connect_by_root y) y, count(*) cnt
from points t
connect by level <= 2 and id <> prior id and x between prior x - 2 and prior x + 2 and y between prior y - 2 and prior y + 2
group by connect_by_root id, connect_by_root x, connect_by_root y
order by 1;

select max(connect_by_root id) id,
       max(connect_by_root x) x,
       max(connect_by_root y) y,
       sum(sqrt(power(x - connect_by_root x, 2) + power(y - connect_by_root y, 2))) dist
from points t
connect by level <= 2 and id <> prior id
group by connect_by_root id, connect_by_root x, connect_by_root y
order by 1;


Или два в одном
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select max(connect_by_root id) id,
       max(connect_by_root x) x,
       max(connect_by_root y) y,
       count(case when x between connect_by_root x - 2 and connect_by_root x + 2 and y between connect_by_root y - 2 and connect_by_root y + 2 then 1 end) cnt,
       sum(sqrt(power(x - connect_by_root x, 2) + power(y - connect_by_root y, 2))) dist
from points t
connect by level <= 2 and id <> prior id
group by connect_by_root id, connect_by_root x, connect_by_root y
order by 1;

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131981
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, не всё еще исчерпано.

Остаётся как минимум модельное решение для второй задачи и еще один совершенно иной подход (упомянутый ранее Кузьмичом 22430088 ).
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40131982
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Вероятно, можно короче записать.
Код: plsql
1.
'sum(for $i in $D/ROW/VAL return <z>{math:sqrt(math:pow($i/X - $X, 2) + math:pow($i/Y - $Y, 2))}</z>)'
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132112
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
модельное решение для второй задачи
Код: 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 points(ID,X,Y,CNT,DIST) as (
select  1, 1, 1,  5, 61.5629421 from dual union all
select  2, 2, 2, 10, 42.9905342 from dual union all
select  3, 3, 1, 10, 42.3402527 from dual union all
select  4, 3, 2, 13, 33.9007161 from dual union all
select  5, 3, 3, 15, 32.0060445 from dual union all
select  6, 3, 4, 12, 36.5312328 from dual union all
select  7, 4, 1, 10, 40.4182704 from dual union all
select  8, 4, 2, 14, 31.1038271 from dual union all
select  9, 4, 3, 16, 28.2066774 from dual union all
select 10, 4, 4, 14, 32.1841901 from dual union all
select 11, 4, 5, 10, 42.4182704 from dual union all
select 12, 5, 2, 13,  35.300723 from dual union all
select 13, 5, 3, 15, 31.6497533 from dual union all
select 14, 5, 4, 13,  34.916584 from dual union all
select 15, 5, 5, 10, 44.6276236 from dual union all
select 16, 6, 3, 11, 41.6318623 from dual union all
select 17, 6, 4, 10, 44.2841669 from dual 
)
select *
from points
model
   dimension by (id)
   measures(x,y,dist, max(id)over() as cnt,0.0 as dist2)
   rules
   iterate(1e6)until(iteration_number>=cnt[1])(
      dist2[any] order by id = 
         dist2[cv()] 
         + nvl(sqrt( power(x[cv()]-x[iteration_number],2)
                    +power(y[cv()]-y[iteration_number],2)
                   ),0)
   )
;



dbms_photoshop
еще один совершенно иной подход (упомянутый ранее Кузьмичом 22430088 ).
pivot c ограничением на целые или pivot xml? или про что речь?
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132114
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
dbms_photoshop
Вероятно, можно короче записать.
Код: plsql
1.
'sum(for $i in $D/ROW/VAL return <z>{math:sqrt(math:pow($i/X - $X, 2) + math:pow($i/Y - $Y, 2))}</z>)'



Код: plsql
1.
'sum($D//VAL/math:sqrt(math:pow(./X - $X, 2) + math:pow(./Y - $Y, 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.
37.
with points(ID,X,Y,CNT,DIST) as (
select  1, 1, 1,  5, 61.5629421 from dual union all
select  2, 2, 2, 10, 42.9905342 from dual union all
select  3, 3, 1, 10, 42.3402527 from dual union all
select  4, 3, 2, 13, 33.9007161 from dual union all
select  5, 3, 3, 15, 32.0060445 from dual union all
select  6, 3, 4, 12, 36.5312328 from dual union all
select  7, 4, 1, 10, 40.4182704 from dual union all
select  8, 4, 2, 14, 31.1038271 from dual union all
select  9, 4, 3, 16, 28.2066774 from dual union all
select 10, 4, 4, 14, 32.1841901 from dual union all
select 11, 4, 5, 10, 42.4182704 from dual union all
select 12, 5, 2, 13,  35.300723 from dual union all
select 13, 5, 3, 15, 31.6497533 from dual union all
select 14, 5, 4, 13,  34.916584 from dual union all
select 15, 5, 5, 10, 44.6276236 from dual union all
select 16, 6, 3, 11, 41.6318623 from dual union all
select 17, 6, 4, 10, 44.2841669 from dual 
)
select--+ NO_XML_QUERY_REWRITE
    id,x,y,dist
    ,xmlcast(
        xmlquery(
        'sum($D//VAL/math:sqrt(math:pow(./X - $X, 2) + math:pow(./Y - $Y, 2)))'
            passing
                xmlelement("ROW",
                    (xmlagg(xmlelement(val, xmlelement(x,x),xmlelement(y,y)))
                       over()
                    )
                ) as D,
                x as X,
                y as Y
            returning content
            )
        as number
        ) as tst
from points;

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132183
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
еще одно ограниченное решение первой задачи
просто аналитическая сумма(range between) + bitand + считаем кол-во битиков-единичек.
Ограничения: в данном решении есть ограничение на макс id <=128 из-за маски to_char, но, в принципе, зная макс ID можно легко подстроить решение разбиением на несколько аналитических сумм.
Код: 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.
with points(ID,X,Y,CNT,DIST) as (
select  1, 1, 1,  5, 61.5629421 from dual union all
select  2, 2, 2, 10, 42.9905342 from dual union all
select  3, 3, 1, 10, 42.3402527 from dual union all
select  4, 3, 2, 13, 33.9007161 from dual union all
select  5, 3, 3, 15, 32.0060445 from dual union all
select  6, 3, 4, 12, 36.5312328 from dual union all
select  7, 4, 1, 10, 40.4182704 from dual union all
select  8, 4, 2, 14, 31.1038271 from dual union all
select  9, 4, 3, 16, 28.2066774 from dual union all
select 10, 4, 4, 14, 32.1841901 from dual union all
select 11, 4, 5, 10, 42.4182704 from dual union all
select 12, 5, 2, 13,  35.300723 from dual union all
select 13, 5, 3, 15, 31.6497533 from dual union all
select 14, 5, 4, 13,  34.916584 from dual union all
select 15, 5, 5, 10, 44.6276236 from dual union all
select 16, 6, 3, 11, 41.6318623 from dual union all
select 17, 6, 4, 10, 44.2841669 from dual 
)
select
    id,x,y,cnt,
    length(
       replace(replace(replace(
          trim(
            translate(
               to_char(
                 bitand( 
                    sum(power(2,id))over(order by x range between 2 preceding and 2 following)
                   ,sum(power(2,id))over(order by y range between 2 preceding and 2 following)
                 )
                ,'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
               )
              ,'123456789ABCDEF0'
              ,'112122312232334'
            )
          )
       ,'2','11')
       ,'3','111')
       ,'4','1111')
    )
     as tst
from points
order by id;

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132729
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov,

В твоей итеративной модели можно избавиться от nvl оперируя с iteration_number + 1 вместо iteration_number.

А запись xpath
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132730
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
pivot c ограничением на целые или pivot xml? или про что речь?
Про unpivot.

Код: plsql
1.
2.
3.
4.
5.
6.
exec dbms_random.seed(1);

create table points(id, x, y) as
select level, dbms_random.value * 10, dbms_random.value * 10
from dual
connect by level <= 2222;



Код: 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.
78.
79.
80.
81.
82.
83.
84.
with t as
(
select t.*,
       (select count(*)
        from points
        where x between t.x - 2 and t.x + 2 and y between t.y - 2 and t.y + 2) cnt
from points t
)
select sum(cnt) from t;

  SUM(CNT)
----------
    636356

Elapsed: 00:00:00.94

with t as
(
select *
from points
model
  dimension by(x, y)
  measures(0 as cnt)
  rules
  (cnt [any, any] order by x, y = count(*)[x between cv(x) - 2 and cv(x) + 2, y between cv(y) - 2 and cv(y) + 2])
)
select sum(cnt) from t;

  SUM(CNT)
----------
    636356

Elapsed: 00:00:01.75

with t as
(
select --+ NO_XML_QUERY_REWRITE
       id,
       x,
       y,
       xmlcast(
         xmlquery(
           'count($D/ROW/VAL[./X >= $X - 2 and ./X <= $X +2 and ./Y >= $Y -2 and ./Y <= $Y +2])'
           passing xmlelement("ROW", (xmlagg(xmlelement(val, xmlelement(x, x), xmlelement(y, y))) over())) as d, x as x, y as y
           returning content) as number) as cnt
from points
)
select sum(cnt) from t;

  SUM(CNT)
----------
    636356

Elapsed: 00:00:43.56

with t as
(
select max(connect_by_root id) id, max(connect_by_root x) x, max(connect_by_root y) y, count(*) cnt
from points t
connect by level <= 2 and id <> prior id and x between prior x - 2 and prior x + 2 and y between prior y - 2 and prior y + 2
group by connect_by_root id, connect_by_root x, connect_by_root y
)
select sum(cnt) from t;

  SUM(CNT)
----------
    636356

Elapsed: 00:02:39.95

with t as
(
select ...
from points t
unpivot ...

)
select sum(cnt) from t;

  SUM(CNT)
----------
    636356

Elapsed: 00:00:05.82


Сравнение просто для информативности.
Понятное дело эта тема ради креатива.

PS. Кстати от connect by я ожидал большего. :)
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132731
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
Про unpivot.
так речь про целые? у меня с самого-самого начала была идея типа
Код: plsql
1.
2.
3.
4.
from points p
unpivot (
  b for a in (x as -2,x as -1, x as 0, x as 1, x as 2)
);

но ты ее зарубил
dbms_photoshop
то есть не обязательно целочисленные как в примере
как ее приспособить для не целых, я что-то даже не стал думать, посчитав, что нельзя...
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132732
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
В твоей итеративной модели можно избавиться от nvl оперируя с iteration_number + 1 вместо iteration_number.
да, я чуял, что где-то напортачил, но было тяжело в такое позднее время да еще после работы уже искать, что я там такого наделал, что у меня 18 итераций на 17 строк получилось
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132733
Фотография 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.
23.
24.
25.
26.
27.
28.
29.
30.
31.
with points(ID,X,Y,CNT,DIST) as (
select  1, 1, 1,  5, 61.5629421 from dual union all
select  2, 2, 2, 10, 42.9905342 from dual union all
select  3, 3, 1, 10, 42.3402527 from dual union all
select  4, 3, 2, 13, 33.9007161 from dual union all
select  5, 3, 3, 15, 32.0060445 from dual union all
select  6, 3, 4, 12, 36.5312328 from dual union all
select  7, 4, 1, 10, 40.4182704 from dual union all
select  8, 4, 2, 14, 31.1038271 from dual union all
select  9, 4, 3, 16, 28.2066774 from dual union all
select 10, 4, 4, 14, 32.1841901 from dual union all
select 11, 4, 5, 10, 42.4182704 from dual union all
select 12, 5, 2, 13,  35.300723 from dual union all
select 13, 5, 3, 15, 31.6497533 from dual union all
select 14, 5, 4, 13,  34.916584 from dual union all
select 15, 5, 5, 10, 44.6276236 from dual union all
select 16, 6, 3, 11, 41.6318623 from dual union all
select 17, 6, 4, 10, 44.2841669 from dual 
)
select
    id,x,y,cnt,
                 cardinality( 
                    cast( collect(SYS.KU$_OBJNUM(id))over(order by x range between 2 preceding and 2 following) as sys.ku$_objnumset) 
                    multiset intersect
                    cast( collect(SYS.KU$_OBJNUM(id))over(order by y range between 2 preceding and 2 following) as sys.ku$_objnumset) 
                 )
     as tst
from points
order by id;

ORA-03113: end-of-file on communication channel

...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132734
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Sayan Malakshinov
посчитав, что нельзя...
ааа... дошло... надо было просто
Код: plsql
1.
2.
3.
4.
from points p
unpivot (
  b for a in (x as -2, x as 2)
);
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132735
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
Код: plsql
1.
collect(...)over(...)

И collect и xmlagg по документации исключительно агрегатные и не аналитические так что тут претензий к Ораклу быть не может.
Sayan Malakshinov
так речь про целые?
Совершенно нет. Я же приложил скрипт создания тестовой таблицы.
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40132737
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
Sayan Malakshinov
Код: plsql
1.
collect(...)over(...)

И collect и xmlagg по документации исключительно агрегатные и не аналитические так что тут претензий к Ораклу быть не может.
Sayan Malakshinov
так речь про целые?
Совершенно нет. Я же приложил скрипт создания тестовой таблицы.
да, блин, хватит ночью писать я и так с бессонницей, теперь ещё тяжелее заснуть когда аж две идеи в голове :(
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40133598
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем основаной намёк был тут 22430093 .
Если там перейти по ссылке то можно было увидеть прикреплённую картинку.

Основная идея состоит в том, чтобы к основному набору добавить его же и искать во вновь добавленном наборе соответствующие строки.
Дублирование исходных данных необходимо потому что pattern matching умеет смотреть только от старта вперёд. *
В отличие от аналитики, где окно может охватывать строки как перед текущей так и после.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select id_ id, x_ x, y_ y, cnt
from points t
unpivot (id for type in (id as 'original', id as 'new')) upvt
match_recognize
(
  order by type desc, x, y
  measures
    --match_number() mn,
    --classifier() cls,
    first(id) id_,
    first(x) x_,
    first(y) y_,
    count(p.type) cnt
   after match skip to next row
   pattern (strt (p|pp)+)
   define
     strt as strt.type = 'original',
     p as p.type = 'new' and
          p.x >= first(x) - 2 and p.x <= first(x) + 2 and
          p.y >= first(y) - 2 and p.y <= first(y) + 2
) mr
order by 1;



Во второй задаче (подсчет расстояний) мне понадобилась ёще группировка потому что в агрегат нельзя передать значение из первой строки совпавшего набора (match).
Поэтому "all rows per match" с последующим "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.
select id_ id, x_ x, y_ y, sum(dist) dist
from points t
unpivot (id for type in (id as 'original', id as 'new')) upvt
match_recognize
(
  order by type desc, x, y
  measures
    --match_number() mn,
    --classifier() cls,
    first(id) id_,
    first(x) x_,
    first(y) y_,
    sqrt(power(p.x - first(x), 2) + power(p.y - first(y), 2)) dist
   all rows per match
   after match skip to next row
   pattern (strt (p|pp)+)
   define
     strt as strt.type = 'original',
     p as p.type = 'new'
) mr
group by id_, x_, y_
order by 1;



Или если скрестить два в один

Код: 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.
select id_ id, x_ x, y_ y, max(cnt) cnt, sum(dist) dist
from points t
unpivot (id for type in (id as 'original', id as 'new')) upvt
match_recognize
(
  order by type desc, x, y
  measures
    --match_number() mn,
    --classifier() cls,
    first(id) id_,
    first(x) x_,
    first(y) y_,
    count(p2.type) cnt,
    sqrt(power(p.x - first(x), 2) + power(p.y - first(y), 2)) dist
   all rows per match
   after match skip to next row
   pattern (strt (p2|p_|pp)+)
   subset p = (p2, p_)
   define
     strt as strt.type = 'original',
     p2 as p2.type = 'new' and
          p2.x >= first(x) - 2 and p2.x <= first(x) + 2 and
          p2.y >= first(y) - 2 and p2.y <= first(y) + 2,     
     p_ as p_.type = 'new'
) mr
group by id_, x_, y_
order by 1;



* Если б условие было типа такого, то в unpivot необходимости не было бы.
Код: plsql
1.
2.
3.
select t.*,
       (select count(*) from points where x between t.x and t.x + 2 and y between t.y and t.y + 2) cnt
from points t;
...
Рейтинг: 0 / 0
Пятничная задача: single from
    #40134069
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop
Код: plsql
1.
2.
3.
from points t
unpivot (id for type in (id as 'original', id as 'new')) upvt
match_recognize

ах, здорово! в голову не пришло, что unpivot с match_recognize вместе могут работать. Да еще я и зашорен был: после игр с match_recognize давным давно, почему-то засело в голову что одна и та же строка не может входить в несколько наборов... Теперь понятно, что это ограничение только стартовой строки.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задача: single from
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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