Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задача: single from / 25 сообщений из 35, страница 1 из 2
04.02.2022, 23:43
    #40131814
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
Имеется таблица с координатами точек.

Найти
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
05.02.2022, 00:37
    #40131821
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
dbms_photoshop
from может втречаться только один раз .
left join, но что-то как-то неспортивно уточни условия
...
Рейтинг: 0 / 0
05.02.2022, 00:50
    #40131822
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
Sayan Malakshinov,

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

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

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



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

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


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

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

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

Публикуй что есть, подходов хватает. Всем хватит подумать.
...
Рейтинг: 0 / 0
05.02.2022, 02:05
    #40131836
Никанор Кузьмич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
05.02.2022, 02:30
    #40131837
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
Кузьмич, а ты тот еще остряк.

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

вроде пришла идея, но что-то не выходит каменный цветочек - какого-то хрена в 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
05.02.2022, 13:50
    #40131877
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
Sayan Malakshinov,

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

С уникальным id странность результата сразу видна
Код: plsql
1.
xmlagg(xmlelement(val, id)) over (order by id rows between 2 preceding and 2 following)
...
Рейтинг: 0 / 0
05.02.2022, 14:19
    #40131880
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
05.02.2022, 14:42
    #40131892
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
Воркэраунд, конечно, есть, но какой-то дурацкий: делать только с 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
06.02.2022, 01:55
    #40131968
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
пофиг, упрощаем в лоб: простенький 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
06.02.2022, 02:45
    #40131971
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
ну и элементарная моделька
Код: 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
06.02.2022, 02:57
    #40131972
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
06.02.2022, 04:59
    #40131978
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
06.02.2022, 05:06
    #40131979
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
Sayan Malakshinov
элементарная моделька
Элементарная она только для первой задачи.
Для второй задачи нам надо в выражении для агрегата ссылаться на текущую строку из левой части правила что невозможно.
На мой взгляд это решается только итеративной моделью.
...
Рейтинг: 0 / 0
06.02.2022, 05:14
    #40131980
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
06.02.2022, 05:19
    #40131981
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
В общем, не всё еще исчерпано.

Остаётся как минимум модельное решение для второй задачи и еще один совершенно иной подход (упомянутый ранее Кузьмичом 22430088 ).
...
Рейтинг: 0 / 0
06.02.2022, 05:39
    #40131982
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
06.02.2022, 21:54
    #40132112
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
06.02.2022, 21:59
    #40132114
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
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
07.02.2022, 12:21
    #40132183
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная задача: single from
еще одно ограниченное решение первой задачи
просто аналитическая сумма(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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пятничная задача: single from / 25 сообщений из 35, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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