powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Головоломки
9 сообщений из 9, страница 1 из 1
Головоломки
    #32074485
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, подскажите, пожалуйста, где можно взять головоломки по T-SQL (составление "кучерявых" запросов)?
Хочется порешать на досуге...
...
Рейтинг: 0 / 0
Головоломки
    #32074494
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе головолока для разминки:

Есть таблица

num
----
2
3
5
6
7
23
24
25
28
29
41
...

т.е. с последовательными номерами, но с дырками.
Нужно получить запрос без циклов, дающий выборку, содержащую только границы диапазонов.
Т.е. к текущему примеру это будет такая выборка

min max
----------
2 3
5 7
23 25
28 29
.............

Hint: Задача решаема. Решение может быть не единственное. Запросы получаются средней сложности, но достаточно короткие в 3-5 строк.
...
Рейтинг: 0 / 0
Головоломки
    #32074501
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joe Celko's SQL Puzzles and Answer , заказать можно на Амазоне.
...
Рейтинг: 0 / 0
Головоломки
    #32074509
Спасибо!
...
Рейтинг: 0 / 0
Головоломки
    #32074717
Осирис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ответ ? Крутил, вертел - никак не соображу.

Вот так я получаю минимумы:

select num as mn, 0 as mx from a as t1
where not exists(select num from a as t2 where t1.num=t2.num+1)

Вот так максимумы:

select 0 as mn, num as mx from a as t1
where not exists(select num from a as t2 where t1.num=t2.num-1)

А как их объединить не соображу. Кроме того, наверное, есть лучший вариант.
...
Рейтинг: 0 / 0
Головоломки
    #32074718
FixeR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот так, например можно (#training - исходная табличка с числами):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t1.num as [min], min(t2.num) as [max]
  from 
    #training t1 left join #training t1_ on t1.num = t1_.num +  1 ,
    #training t2 left join #training t2_ on t2.num = t2_.num -  1 
  where
        t1_.num is null
    and t2_.num is null
    and t1.num <= t2.num
  group by t1.num
...
Рейтинг: 0 / 0
Головоломки
    #32074743
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должен заметить, что этот пример не абстракция. Он имеет вполне реальное применение - аналогичным образом я храню и задействую в расчетах банковские ставки.
...
Рейтинг: 0 / 0
Головоломки
    #32074785
Fedot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Nickolay
Что значит "заказать на Амазоне"?
Пожалуйста, поконкретнее.
...
Рейтинг: 0 / 0
Головоломки
    #32074799
Globus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А есть ли у кого-то подобные вещи в электронном варианте?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Головоломки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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