Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти минимальное, но не просто минимальное 
:(
    Опции темы
proger
Дата 13.10.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



В базе есть таблица где id такие: 1,2,3,5,6
Вот как найти минимальное число, которого нет в базе, т.е. 4, только это надо сделать в запросе!
PM MAIL   Вверх
LSD
Дата 13.10.2005, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



А почему не 0, его ведь тоже нет среди ID?
Почетче сформулируй вопрос.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
proger
Дата 13.10.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



Цитата(LSD @ 13.10.2005, 12:49)
А почему не 0, его ведь тоже нет среди ID?
Почетче сформулируй вопрос.

Можно и 0.
Надо найти в базе минимальное число, которое отсутствует!
PM MAIL   Вверх
LSD
Дата 13.10.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Код
select min(ID)-1 from my_table



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
proger
Дата 14.10.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



Цитата(LSD @ 13.10.2005, 12:57)
Код
select min(ID)-1 from my_table

А если такие 0,1,2,4,5
PM MAIL   Вверх
igon
Дата 16.10.2005, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Код

select min(a.id)+1
  from my_table a Left Join my_table b On a.id+1 = b.id
  Where b.id Is Null

Если "дырок" нет, вернет max(id)+1.
Если 0 не будет, его тоже не вернет smile
Более того, не вернет и 1, если последовательность твоих ID начинается с 2 (2,4,5).
Т.е. корректно будет работать, если "дырка" "обрамлена" с ДВУХ сторон.


--------------------
Хотите поговорить об этом?
PM   Вверх
proger
Дата 17.10.2005, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



Цитата(igon @ 16.10.2005, 00:34)
Код

select min(a.id)+1
  from my_table a Left Join my_table b On a.id+1 = b.id
  Where b.id Is Null

Если "дырок" нет, вернет max(id)+1.
Если 0 не будет, его тоже не вернет smile
Более того, не вернет и 1, если последовательность твоих ID начинается с 2 (2,4,5).
Т.е. корректно будет работать, если "дырка" "обрамлена" с ДВУХ сторон.

А подробнее описать твой запрос не можешь, обьяснить?
PM MAIL   Вверх
LSD
Дата 17.10.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(proger @ 17.10.2005, 12:40)
А подробнее описать твой запрос не можешь, обьяснить?

Этот запрос вначале найдет все дырки, выберет минимальную из них и вернет значние на 1 больше.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
igon
Дата 17.10.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Цитата
Этот запрос вначале найдет все дырки, выберет минимальную из них и вернет значние на 1 больше.

Почти так, только 1 прибавляется не к найденной минимальной "дырке", а к минимальному ID, для которого при объединении таблицы самой с собой не найден ID, больший на 1.
Для 1,2,4,5 запрос
Код

select a.id, b.id
  from my_table a Left Join my_table b On a.id+1 = b.id

вернет
Код

a.ID | b.ID
---------
    1 | 2  
    2 | 3  
    3 | null  
    5 | 6  
    6 | null 

Left [Outer] Join работает так, что
Цитата
For all rows in A that have no matching rows in B, Oracle returns null for any select list expressions containing columns of B

Т.е. запрос можно "прочитать" так: "Для каждого ID из A вывести его значение и значение ID из B, для которого выполняется условие a.id+1 = b.id. Если условие не выполняется ("дырка"), вывести null.
При помощи
Код

Where b.id Is Null

оставляем только записи, у a.ID которых рядом - "дырка". min(a.ID) дает наименьший такой ID. Прибавление к нему 1 и дает искомое
Цитата
минимальное число, которого нет в базе.



--------------------
Хотите поговорить об этом?
PM   Вверх
Paradox
Дата 21.10.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: 3
Всего: 1



а если 1 2 5 6 ??? smile


--------------------
---
PM MAIL WWW   Вверх
LSD
Дата 21.10.2005, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(Paradox @ 21.10.2005, 11:29)
а если 1 2 5 6 ???

Вернет 3. А в чем собстевенно вопрос?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Paradox
Дата 22.10.2005, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: 3
Всего: 1



да ни в чем
невнимательно глянул первый раз
думал обсуждается алгоритм поиска дырок smile


--------------------
---
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1268 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.