Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Головоломки / 9 сообщений из 9, страница 1 из 1
02.12.2002, 09:47:36
    #32074485
Тимур
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломки
Господа, подскажите, пожалуйста, где можно взять головоломки по T-SQL (составление "кучерявых" запросов)?
Хочется порешать на досуге...
...
Рейтинг: 0 / 0
02.12.2002, 10:23:48
    #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
02.12.2002, 10:28:00
    #32074501
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломки
Joe Celko's SQL Puzzles and Answer , заказать можно на Амазоне.
...
Рейтинг: 0 / 0
02.12.2002, 10:41:47
    #32074509
Головоломки
Спасибо!
...
Рейтинг: 0 / 0
02.12.2002, 16:06:03
    #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
02.12.2002, 16:14:04
    #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
02.12.2002, 16:41:33
    #32074743
Pavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломки
Должен заметить, что этот пример не абстракция. Он имеет вполне реальное применение - аналогичным образом я храню и задействую в расчетах банковские ставки.
...
Рейтинг: 0 / 0
02.12.2002, 17:32:58
    #32074785
Fedot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломки
2 Nickolay
Что значит "заказать на Амазоне"?
Пожалуйста, поконкретнее.
...
Рейтинг: 0 / 0
02.12.2002, 17:54:46
    #32074799
Globus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Головоломки
А есть ли у кого-то подобные вещи в электронном варианте?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Головоломки / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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