Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синтаксис какой СУБД? / 25 сообщений из 25, страница 1 из 1
09.04.2020, 13:30
    #39945274
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Здравствуйте! Есть код SQL:
Код: plsql
1.
2.
3.
4.
5.
create table D_TEST ( id number(17), numb number(10) ) 
alter table D_TEST 
add constraint PK_D_TEST primary key (ID); 
alter table D_TEST 
add constraint UK_D_TEST_N unique (NUMB);



Подскажите, правильно ли я понимаю, что этот код oracle?

Помогите решить задачу:
Одним запросом необходимо получить минимальный свободный (отсутствующий) номер (NUMB), но не менее минимального занятого (существующего) номера. Если нет ни одной записи в таблице, запрос должен вернуть значение 1.
...
Рейтинг: 0 / 0
09.04.2020, 14:13
    #39945312
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
eliasum,

поиск на сайте по слову "дырка"

....
stax
...
Рейтинг: 0 / 0
09.04.2020, 14:18
    #39945318
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax, что это значит?
...
Рейтинг: 0 / 0
09.04.2020, 14:20
    #39945323
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
eliasum
Stax, что это значит?


https://www.sql.ru/forum/actualsearch.aspx?search=?????&sin=0&bid=3&a=&ma=0&dt=-1&s=1&so=1

ps
счас немножко занят, освобожусь попробую нарисовать

....
stax
...
Рейтинг: 0 / 0
09.04.2020, 14:36
    #39945336
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax, не сразу про дырки понял))
...
Рейтинг: 0 / 0
09.04.2020, 15:01
    #39945366
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
eliasum,

если нет свободных то , запрос должен вернуть ... ?

....
stax
...
Рейтинг: 0 / 0
09.04.2020, 15:45
    #39945420
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
eliasum,

если нет свободных то 0


rownum/row_number()
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with d_test(numb) as (
--/*
select 5 from dual union all
select 6 from dual union all
--select 7 from dual union all
select 8 from dual union all
select 9 from dual union all
--select 10 from dual union all
select 11 from dual union all
--*/
select 12 from dual where 1=2)
, t as (select numb,numb-row_number() over (order by numb) g from d_test)
select 
  case 
   when min(max(numb)) is null then 1
   when min(min(g))+sum(count(*))=max(max(numb)) then 0
   else min(max(numb))+1
   end d
from t
group by g
SQL> /

         D
----------
         7



lead
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> with d_test(numb) as (
  2  --/*
  3  select 5 from dual union all
  4  select 6 from dual union all
  5  --select 7 from dual union all
  6  select 8 from dual union all
  7  select 9 from dual union all
  8  --*/
  9  select 10 from dual where 1=2)
 10  , t as (select numb,lead(numb,1,numb-1) over (order by numb) le from d_test)
 11  , tt as (
 12  select
 13    min(numb) mn
 14   ,min(le) KEEP (DENSE_RANK FIRST ORDER BY null) l
 15  from t where numb<>le-1)
 16  select decode(mn,null,1,l+1,0 /*mn+1*/,mn+1) d from tt
 17  /

         D
----------
         7



зы
+
match_recognize, model, ...

....
stax
...
Рейтинг: 0 / 0
09.04.2020, 15:48
    #39945425
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax
если нет свободных то 0
То max+1. Неужели бритва Оккама так сложна в здравомыслии?
...
Рейтинг: 0 / 0
09.04.2020, 16:43
    #39945463
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax

match_recognize


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select  nvl(max(hole),1) hole
  from  t
  match_recognize(
                  order by n
                  measures
                    last(no_gap.n) + 1 hole
                  pattern(no_gap+ gap*)
                 define no_gap as n = nvl(prev(n) + 1,n) and match_number() = 1,
                        gap as n != prev(n) + 1 and match_number() = 1
                 )
/



SY.
...
Рейтинг: 0 / 0
09.04.2020, 17:11
    #39945479
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
SY,

так не проще?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with d_test(numb) as (
--/*
select 5 from dual union all
select 6 from dual union all
--select 7 from dual union all
select 8 from dual union all
select 9 from dual union all
--select 10 from dual union all
select 11 from dual union all
--*/
select 12 from dual where 1=2)
select nvl(min(n)+1,1) nn 
from d_test  
  match_recognize(
  order by numb
  measures
      strt.numb n
      ,match_number() m
   pattern(strt d |strt$)
   define d as numb <> strt.numb+1 --and match_number()=1
   )
   where m = 1
/



ps
мож match_number()=1 можно как то красивее/оптимальнее заюзать

....
stax
...
Рейтинг: 0 / 0
09.04.2020, 17:23
    #39945491
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax,

добавил
strt as match_number()=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.
with d_test(numb) as (
--/*
select 5 from dual union all
select 6 from dual union all
--select 7 from dual union all
select 8 from dual union all
select 9 from dual union all
--select 10 from dual union all
select 11 from dual union all
select 12 from dual union all
--*/
select 12 from dual where 1=2)
select nvl(max(n)+1,1) nn 
from d_test  
  match_recognize(
  order by numb
  measures
      strt.numb n
      --,d.numb dd
      ,match_number() m
   pattern(strt d |strt$)
   define 
       strt as match_number()=1
      ,d as numb <> strt.numb+1 and match_number()=1
   )



....
stax
...
Рейтинг: 0 / 0
09.04.2020, 17:35
    #39945504
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax,

перебор с match_number()=1

Код: plsql
1.
2.
3.
   define 
       strt as match_number()=1
      ,d as numb <> strt.numb+1 



.....
stax
...
Рейтинг: 0 / 0
09.04.2020, 18:24
    #39945544
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Спасибо большое!
...
Рейтинг: 0 / 0
09.04.2020, 18:33
    #39945545
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax
SY,

так не проще?
Вы бы оба не позорились.
Казалось бы зачем натягивать агрегат на match_recognize.
...
Рейтинг: 0 / 0
09.04.2020, 18:38
    #39945546
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Кобанчег

Казалось бы зачем натягивать агрегат на match_recognize.


Если нет ни одной записи в таблице, запрос должен вернуть значение 1.

SY.
...
Рейтинг: 0 / 0
10.04.2020, 00:24
    #39945652
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax

Код: plsql
1.
pattern(strt d |strt$)

Так под шаблон попадает либо 1 либо 2 строки что меньше чем в альтернативном решении,
но в любом случае будут прочитаны все строки и будут отсортированы все строки таблицы.
Даже если на столбце есть уникальный индекс это может дать MATCH RECOGNIZE BUFFER вместо MATCH RECOGNIZE SORT, но профита особого от этого нет.
SY
Кобанчег

Казалось бы зачем натягивать агрегат на match_recognize.


Если нет ни одной записи в таблице, запрос должен вернуть значение 1.

SY.
Согласен, так имеет смысл. В select nvl() from dual особой необходимости нет.
Тем более что парсер подглючивает когда match_recognize в скаляре.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select (select * from dual match_recognize (measures 1 x pattern(p+) define p as 1=1)) x from dual;

         X
----------
         1

SQL> select (select * from dual match_recognize (measures 1 x pattern(p?) define p as 1=1)) x from dual;
select (select * from dual match_recognize (measures 1 x pattern(p?) define p as 1=1)) x from dual
                                                                  *
ERROR at line 1:
ORA-00911: invalid character

...
Рейтинг: 0 / 0
10.04.2020, 01:47
    #39945669
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Кобанчег
Stax

Код: plsql
1.
pattern(strt d |strt$)

Так под шаблон попадает либо 1 либо 2 строки что меньше чем в альтернативном решении,
но в любом случае будут прочитаны все строки и будут отсортированы все строки таблицы.
Даже если на столбце есть уникальный индекс это может дать MATCH RECOGNIZE BUFFER вместо MATCH RECOGNIZE SORT, но профита особого от этого нет.
Ну и главное касательно match_recognize - не надо матчить то, что не нужно.
Более того, в этом случае это позволяет избавиться от backtracking.
Соответственно получаем MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTOMATON
(или MATCH RECOGNIZE BUFFER DETERMINISTIC FINITE AUTOMATON при наличии нужного индекса)
вместо MATCH RECOGNIZE SORT.
Для этой задачи кроме более красивого плана, впрочем, особого профита опять же нет.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select nvl(max(hole+1),1) hole
from d_test  
match_recognize
(
  order by numb
  measures numb as hole
  pattern(x+)
  define x as numb = nvl(prev(numb)+1,numb) and match_number() = 1
)


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
-------------------------------------------------------------------
| Id  | Operation                                        | Name   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT                                 |        |
|   1 |  SORT AGGREGATE                                  |        |
|   2 |   VIEW                                           |        |
|   3 |    MATCH RECOGNIZE SORT DETERMINISTIC FINITE AUTO|        |
|   4 |     TABLE ACCESS FULL                            | D_TEST |
-------------------------------------------------------------------
...
Рейтинг: 0 / 0
10.04.2020, 06:29
    #39945679
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Уважаемые спецы, прокомментируйте пожалуйста ваш код поподробнее, какую теорию нужно изучить?
...
Рейтинг: 0 / 0
10.04.2020, 14:24
    #39945853
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
eliasum
Уважаемые спецы, прокомментируйте пожалуйста ваш код поподробнее, какую теорию нужно изучить?
Какие затруднения вызывает ввести нужные ключевые слова в поиск?

Конкретно для твоей задачи ничего изучать не надо - достаточно понять самое простое решение 22071163 .
Которое к тому же самое эффективное.
...
Рейтинг: 0 / 0
10.04.2020, 14:37
    #39945865
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Кобанчег
достаточно понять самое простое решение 22071163 .
Которое к тому же самое эффективное.


допиливать надо

ps
насчет самое эффективное, возможно ето зависит и от обьемов и от положения дырки

....
stax
...
Рейтинг: 0 / 0
10.04.2020, 15:28
    #39945894
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax
допиливать надо
Да, в той теме была минимальная граница а тут ее нет.
Странно почему на таком тривиальном изменении делается акцент.
Ты исходишь из допущения что адресат является имбецилом не в состоянии внести изменения в 5 строчек кода?
Stax
насчет самое эффективное, возможно ето зависит и от обьемов и от положения дырки
В таких случаях можно искать с конца а не с начала... или одновременно.
И перейти от cursor for loop к bulk fetch с отрегулированным размером пачки.
...
Рейтинг: 0 / 0
10.04.2020, 15:53
    #39945904
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Кобанчег,

исходил из

автор Конкретно для твоей задачи ничего изучать не надо - достаточно понять самое простое решение



конкретно для даной задачи надо допилить
1) пустая таблица
2) нет дырки (что вернуть?)

тоесть
не достаточно понять, но надо и допилить

зы
я не доктор чтоб кого-то считать имбицилом
тем более
«имбецил» — устаревшие и не рекомендуются к использованию, так как они вышли за сугубо медицинские рамки и стали носить социальный (негативный) оттенок



.....
stax
...
Рейтинг: 0 / 0
10.04.2020, 16:32
    #39945912
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax
нет дырки (что вернуть?)
Ты тут ввязался решать непосильнейшую охренительнейшую мегазадачу, которую у тебя никто никогда ни разу не спрашивал, а, тем более, даже не пытался решать. И у тебя есть решение для него, но бац - какая-то неприятная засада - дырок-то может не быть. И тут впору открывать НИР...
...
Рейтинг: 0 / 0
10.04.2020, 17:47
    #39945950
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Stax
конкретно для даной задачи надо допилить
1) пустая таблица
2) нет дырки (что вернуть?)
Не надо ничего никуда пилить.
Есть проход по курсору с конкретным условием прерывания и в определенном порядке и есть возврат результата. Всё.
Обычно хорошим стилем программирования считается когда в функции есть только одна точка выхода.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function get_hole return int is
  prev int;
begin
  for i in (select rownum rn, numb n from d_test order by numb) loop
    if i.n - prev > 1 then exit; end if;
    prev := i.n;
  end loop;
  return nvl(prev, 0) + 1;
end get_hole;

В решении НЕ важно есть ли дырка или нет.
Для пустой таблицы добавлено nvl.
Это требует по-твоему дополнительных замечаний?

В твоем случае, к сожалению, доходит до маразма.
Даже если решение на форуме было дано 100 раз и тут появляется вопрошающий у которого другое название таблицы или колонок ты не можешь удержатьяся от соблазна родить 101-й дубль.

Это наводит на мысль, что ты относишься к вопрошающим как к умственно отсталым неспособным на самую примитивную умственную деятельность.
Stax
они вышли за сугубо медицинские рамки
Ты всё правильно понял.

PS.
Stax
эффективное, возможно ето
Возможно, стоит научится писать "это" с правильной буквы раз уж она у тебя есть на кливиатуре и ты даже используешь её в других словах.
...
Рейтинг: 0 / 0
11.04.2020, 09:07
    #39946121
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синтаксис какой СУБД?
Спасибо большое за это решение, буду разбираться!

Кобанчег

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function get_hole return int is
  prev int;
begin
  for i in (select rownum rn, numb n from d_test order by numb) loop
    if i.n - prev > 1 then exit; end if;
    prev := i.n;
  end loop;
  return nvl(prev, 0) + 1;
end get_hole;

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


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