Как найти дырку?(SQL)
От: terma  
Дата: 19.11.03 11:04
Оценка:
Добрый день!
Была на собеседование и задали мне вопрос:
есть таблица t одно поле id Значения в поле:1,2,3,5,6,etc.
Необходимо написать запрос, который найдет первую дырку(т.е. пропущенное 4), причем не использовать курсоры и поле не identity(просто по identity есть пример в help)
Как это сделать не знаю ?
помогите мне
А то чувствую себя просто опущенной
Re: Как найти дырку?(SQL)
От: Merle Австрия http://rsdn.ru
Дата: 19.11.03 11:08
Оценка:
Здравствуйте, terma, Вы писали:

T>Как это сделать не знаю ? помогите мне

T>А то чувствую себя просто опущенной
Эээ... девушка.. ? Буквально двумя топиками ниже: http://rsdn.ru/Forum/?mid=448164
Автор: Titus
Дата: 19.11.03

И там, в ответе Мальборо, есть ссылка, на старое обсуждение этого вопроса.
Будьте пожалуйста внимательнее...

P. S.
Вопросы ходят уже оптом.
Мы уже победили, просто это еще не так заметно...
Re[2]: Как найти дырку?(SQL)
От: TK Лес кывт.рф
Дата: 19.11.03 11:15
Оценка:
Hello, "Merle"
>
> T>Как это сделать не знаю ? помогите мне
> T>А то чувствую себя просто опущенной
> Эээ... девушка.. ? Буквально двумя топиками ниже: http://rsdn.ru/Forum/?mid=448164
Автор: Titus
Дата: 19.11.03

> И там, в ответе Мальборо, есть ссылка, на старое обсуждение этого вопроса.
> Будьте пожалуйста внимательнее...
>

Кстати, вопрос http://rsdn.ru/Forum/?mid=448164
Автор: Titus
Дата: 19.11.03
и ссылка мальборо просто похожи, но ответа там нет.
Например здесь http://www.rsdn.ru/Forum/?mid=374449
Автор: Merle
Дата: 04.09.03
находятся границы разрывов, но не разрывы целиком, как это было в исходном вопросе.
Posted via RSDN NNTP Server 1.6
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Как найти дырку?(SQL)
От: Forint Украина  
Дата: 19.11.03 11:18
Оценка:
Я бы предложил что-то вроде этого:
1. Находит id, у которых нет соседа с большим номером:
select id from test
where id not in (
select t1.id
from test as t1
inner join test as t2 on t1.id+1=t2.id)

2. ну а для первой дырки:
select top 1 id+1 from test
where id not in(
select t1.id
from test as t1
inner join test as t2 on t1.id+1=t2.id)
order by id asc
... << RSDN@Home 1.0 beta 7a >>
Re: Как найти дырку?(SQL)
От: _MarlboroMan_ Россия  
Дата: 19.11.03 11:23
Оценка:
Здравствуйте, terma, Вы писали:

select t1.id + 1
from table1 t1
left join table1 t2 on t2.id = t1.id + 1
where t2.id is null
... << RSDN@Home 1.1 beta 2 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[3]: Как найти дырку?(SQL)
От: _MarlboroMan_ Россия  
Дата: 19.11.03 11:29
Оценка:
Здравствуйте, TK, Вы писали:

TK>Например здесь http://www.rsdn.ru/Forum/?mid=374449
Автор: Merle
Дата: 04.09.03
находятся границы разрывов, но не разрывы целиком, как это было в исходном вопросе.


дык и мы вроде не благотворительностью занимаемся...
надо ж народу и головой хоть немножко думать ...
... << RSDN@Home 1.1 beta 2 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[2]: Как найти дырку?(SQL)
От: terma  
Дата: 19.11.03 11:30
Оценка:
Всем большое спасибо, но когда мне поставили этот вопрос там не шло речи о наличии первой таблицы, где записи упорядочены
была только одна таблица
Видимо, я должна была сама догадатся
Еще раз спасибо
Re: Как найти дырку?(SQL)
От: terma  
Дата: 19.11.03 11:38
Оценка:
Я наконец-то все поняла
Спасибо
Re[4]: Как найти дырку?(SQL)
От: TK Лес кывт.рф
Дата: 19.11.03 11:42
Оценка:
Hello, "_MarlboroMan_"
>
> TK>Например здесь http://www.rsdn.ru/Forum/?mid=374449
Автор: Merle
Дата: 04.09.03
находятся границы разрывов, но не разрывы целиком, как это было в исходном вопросе.

>
> дык и мы вроде не благотворительностью занимаемся...
> надо ж народу и головой хоть немножко думать ...

Может поделишься с общественностью?

Есть таблица:

1
5
6
100

Нужно написать запрос, который вернет:
2
3
4
7

8
9
10
11
12
13
14
...
...
...
97
98
99

Что и было в исходном вопросе.
Posted via RSDN NNTP Server 1.6
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Как найти дырку?(SQL)
От: _MarlboroMan_ Россия  
Дата: 19.11.03 12:01
Оценка:
Здравствуйте, TK, Вы писали:

TK>Может поделишься с общественностью?


TK>Что и было в исходном вопросе.


классическая задача требует найти начала или (интервалы) гэпов.
а вот твоя задача "штатными" средствами (в один-два запроса) не решается.

легко найти надачло и конец гэпа. легко найти "длинну" гэпа.
а вот сформировать отсутствующие "id"-ы — тут привет.

да и надо ли? а если надо, то для чего? я конечно могу щаз накидать простенький универсальный код, но для любой из конкретных задач и "платформ" можно будет написать в разы лучший код.
... << RSDN@Home 1.1 beta 2 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[2]: Как найти дырку?(SQL)
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.11.03 16:30
Оценка:
Здравствуйте, _MarlboroMan_, Вы писали:

_MM_>Здравствуйте, terma, Вы писали:


_MM_>select t1.id + 1

_MM_>from table1 t1
_MM_>left join table1 t2 on t2.id = t1.id + 1
_MM_>where t2.id is null

Он тебе последнюю запись тоже вернет.
... << RSDN@Home 1.1.0 stable >>
Re[5]: Как найти дырку?(SQL)
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.11.03 17:08
Оценка:
Здравствуйте, TK, Вы писали:

[]

TK>Может поделишься с общественностью?


[]

Запроста!
create table test(i int)
insert into test values(1)
insert into test values(5)
insert into test values(6)
insert into test values(10)
insert into test values(100)

declare @max int
set @max = (select max(i) from test)
print @max
with simple(i)
as
(
    select 1
    union all
    select i = i + 1 from simple where i < @max
)
select i from simple 
where i not in (select i from test)
... << RSDN@Home 1.1.0 stable >>
Re[6]: Как найти дырку?(SQL)
От: Merle Австрия http://rsdn.ru
Дата: 19.11.03 22:16
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Запроста!

Хаа!
Я так тоже могу, а вот 99.9% процента жаждущих будут ждать выхода юкона...
Чего людей-то зря дразнить?
... << RSDN@Home 1.1 beta 1 >>
Мы уже победили, просто это еще не так заметно...
Re: Как найти дырку?(SQL)
От: kadalex Россия  
Дата: 21.11.03 04:42
Оценка: 3 (1)
Здравствуйте, terma, Вы писали:

T>Добрый день!

T>Была на собеседование и задали мне вопрос:
T>есть таблица t одно поле id Значения в поле:1,2,3,5,6,etc.
T>Необходимо написать запрос, который найдет первую дырку(т.е. пропущенное 4), причем не использовать курсоры и поле не identity(просто по identity есть пример в help)
T>Как это сделать не знаю ?
T>помогите мне
T>А то чувствую себя просто опущенной

не надо расстраиваться по таким пустякам, вот как бы я решил эту задачку:
итак есть таблица t со значениями в поле id: 1,2,3,5,6,8,
а вот после такого запроса мы увидим список дыр
select id+1 from t where id not in(select id-1 from t) order by id

результат: 4,7,9. С таким же успехом можно выполнить такой запрос (он вроде как быстрей должен обрабатываться):
select id+1 from t t1 where id+1 not in(select t2.id from t t2 where t2.id>t1.id) order by id
[code]
если вам только одно значение надо (первое) то добавьте TOP 1:
[code]
select TOP 1 id+1 from t where id not in(select id-1 from t) order by id

результат: 4

С уважением, kadalex
Re[3]: Как найти дырку?(SQL)
От: _MarlboroMan_ Россия  
Дата: 21.11.03 05:09
Оценка: :)
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Он тебе последнюю запись тоже вернет.


а разве все что после конца данных — это не дыра? одна такая большая замечательная дыра :))
... << RSDN@Home 1.1 beta 2 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.