Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Таблица чисел  [new]
AlejandroNonemo
Member

Откуда:
Сообщений: 8
Здравствуйте!
Подскажите, пожалуйста, с решением задачи. Буду очень благодарен. Недостаточно опыта с SQL.

Дана таблица целых, не повторяющихся чисел. Составить запрос, который выведет все «диапазоны дырок», т.е. диапазоны чисел, которые в таблице отсутствуют. От минимального до максимального. Курсоры и циклы использовать нельзя.

Результат запроса должен вернуть

VstartVStop
4 6
10 10
12 99
105 109

Думаю, надо сначала найти эти диапазоны, сгруппировать их, и в каждом найти минимальное и максимальное. Но вот с реализацией у меня проблемы(
27 авг 12, 14:01    [13069617]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/forum/afsearch.aspx?s=%EF%EE%E8%F1%EA+%E4%FB%F0%EE%EA&bid=1
27 авг 12, 14:02    [13069632]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
user89
Member

Откуда:
Сообщений: 2083
AlejandroNonemo,

вопрос несложный. Если дадите заполненные тестовые данные типа
declare @t table
insert into @t ...
то напишу решение.
27 авг 12, 14:48    [13070000]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
AlejandroNonemo,

а это не sql_ex часом?
27 авг 12, 15:03    [13070133]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
AlejandroNonemo
Member

Откуда:
Сообщений: 8
user89,

declare @Employe table (EmployeID int)

insert into @Employe(EmployeID)values (2)
insert into @Employe(EmployeID)values (4)
insert into @Employe(EmployeID)values (5)
insert into @Employe(EmployeID)values (25)
insert into @Employe(EmployeID)values (26)
insert into @Employe(EmployeID)values (28)
insert into @Employe(EmployeID)values (50)
insert into @Employe(EmployeID)values (100)
27 авг 12, 15:29    [13070397]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
таблица чисел
Guest
AlejandroNonemo,

Так пойдет?
declare @Employe table (EmployeID int)
insert into @Employe(EmployeID)values (2)
insert into @Employe(EmployeID)values (4)
insert into @Employe(EmployeID)values (5)
insert into @Employe(EmployeID)values (25)
insert into @Employe(EmployeID)values (26)
insert into @Employe(EmployeID)values (28)
insert into @Employe(EmployeID)values (50)
insert into @Employe(EmployeID)values (100)

select e1.EmployeID,e2.EmployeID from (select EmployeID, row_number() over (order by EmployeID) as Num from @Employe) e1
join (select EmployeID, row_number() over (order by EmployeID) [Num] from @Employe) e2 on e2.Num=e1.Num+1
where e2.EmployeID-e1.EmployeID>1
27 авг 12, 15:54    [13070664]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
таблица чисел
Guest
таблица чисел
AlejandroNonemo,

Так пойдет?
declare @Employe table (EmployeID int)
insert into @Employe(EmployeID)values (2)
insert into @Employe(EmployeID)values (4)
insert into @Employe(EmployeID)values (5)
insert into @Employe(EmployeID)values (25)
insert into @Employe(EmployeID)values (26)
insert into @Employe(EmployeID)values (28)
insert into @Employe(EmployeID)values (50)
insert into @Employe(EmployeID)values (100)

select e1.EmployeID,e2.EmployeID from (select EmployeID, row_number() over (order by EmployeID) as Num from @Employe) e1
join (select EmployeID, row_number() over (order by EmployeID) [Num] from @Employe) e2 on e2.Num=e1.Num+1
where e2.EmployeID-e1.EmployeID>1


Сорри, вот так.
declare @Employe table (EmployeID int)
insert into @Employe(EmployeID)values (2)
insert into @Employe(EmployeID)values (4)
insert into @Employe(EmployeID)values (5)
insert into @Employe(EmployeID)values (25)
insert into @Employe(EmployeID)values (26)
insert into @Employe(EmployeID)values (28)
insert into @Employe(EmployeID)values (50)
insert into @Employe(EmployeID)values (100)

select e1.EmployeID+1,e2.EmployeID-1 from (select EmployeID, row_number() over (order by EmployeID) as Num from @Employe) e1
join (select EmployeID, row_number() over (order by EmployeID) [Num] from @Employe) e2 on e2.Num=e1.Num+1
where e2.EmployeID-e1.EmployeID>1
27 авг 12, 15:56    [13070691]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
user89
Member

Откуда:
Сообщений: 2083
AlejandroNonemo,

вот еще вариант
;with m as (
  select min(EmployeID) [min_id], max(EmployeID) [max_id] from @Employe
  union all
  select min_id+1, max_id from m where min_id < max_id
), t as (
  select min_id, min_id - row_number() over(order by (select 0)) [gr]
  from m
  left join @Employe e on m.min_id = e.EmployeID
  where e.EmployeID is null
)
select min(min_id), max(min_id)
from t
group by gr

З.Ы. Вместо рекурсии лучше использовать готовую таблицу натуральных чисел.
27 авг 12, 17:20    [13071482]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Точно такая же тема.
27 авг 12, 17:59    [13071782]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
Vitaliy VK
Member

Откуда:
Сообщений: 8
Задача с sql-ex.ru
27 авг 12, 19:14    [13072115]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
Vitaliy VK
Member

Откуда:
Сообщений: 8
user89, написано диапазоны дырок, а не мах и мin. Для нахождения минимума и максимума нужно найти дырки возле каждого из чисел а потом использовать соответствующие агрегатные функции
27 авг 12, 22:25    [13072765]     Ответить | Цитировать Сообщить модератору
 Re: Таблица чисел  [new]
AlejandroNonemo
Member

Откуда:
Сообщений: 8
user89, спасибо огромное, всё работает.
iap, Возможно), но я задание получил из другого места, где корни всего этого - не знаю.
28 авг 12, 13:25    [13075603]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить