Хитрый запрос

tester123
Дата: 14.09.2006 12:42:27
Погомите с решением следующей задачки:
Есть таблица вида:
56
57
58
60
61
63
70
71
Необходимо привести её к виду:
56 - 58
60 - 61
63 - 63
70 - 71
Знаю, что просто, но не могу понять, как :(
pavel73
Дата: 14.09.2006 12:50:37
Есть сайт Головоломки и загадки, может сначала туда стоит обратиться
vooo
Дата: 14.09.2006 12:50:51
Поиск
Например
тут
new_jeep
Дата: 14.09.2006 12:53:54
Значения только Integer и все значения известны на момент обработки?
pavel73
Дата: 14.09.2006 12:56:03
vooo
Поиск
Например
тут


Интересно какую вы логику в его результате углядели :)
Владимор Конев
Дата: 14.09.2006 12:56:59
-- Начало эмуляции тестовых данных:
with t (num)
as (
select 56 as num union all
select 57 as num union all
select 58 as num union all
select 60 as num union all
select 61 as num union all
select 63 as num union all
select 70 as num union all
select 71 as num
)
-- Конец эмуляции тестовых данных.
--
-- Непосредственно сам запрос:
select min(num) as start_num,
max(num) as end_num,
count(1) as cnt
from (
select num,
(
select count(num)
from t t1
where t1.num <= t.num
) as rn
from t)
group by num - rn

Query finished, retrieving results...

START_NUM END_NUM CNT
--------- ------- ---
56 58 3
60 61 2
63 63 1
70 71 2

4 row(s) retrieved
Владимор Конев
Дата: 14.09.2006 12:57:57
Ой, забыл код выделить. Вот так оно красивее будет:
with t (num)
  as (
        select 56 as num union all
        select 57 as num union all
        select 58 as num union all
        select 60 as num union all
        select 61 as num union all
        select 63 as num union all
        select 70 as num union all
        select 71 as num 
      )
-- Конец эмуляции тестовых данных.
--
-- Непосредственно сам запрос:
select min(num) as start_num,
       max(num) as end_num,
       count(1) as cnt
  from (
          select num,
                 (
                    select count(num) 
                      from t t1 
                     where t1.num <= t.num
                 ) as rn
            from t)
  group by num - rn

Query finished, retrieving results...

START_NUM   END_NUM   CNT
---------   -------   ---
       56        58     3 
       60        61     2 
       63        63     1 
       70        71     2 

4 row(s) retrieved
vooo
Дата: 14.09.2006 13:06:40

Интересно какую вы логику в его результате углядели :)

непрерывные интервалы, а что?
Владимор Конев
Дата: 14.09.2006 13:06:43
2 Автор:
А у тебя вообще какой сервер-то хоть?
Для 2005-го можно получить интересные решения на аналитических функциях...
В частности нумератор строк сделать не подзапросом, а при помощи ROW_NUMBER() / DENSE_RANK()
pavel73
Дата: 14.09.2006 13:48:10
vooo

Интересно какую вы логику в его результате углядели :)

непрерывные интервалы, а что?


А то что для меня это не актуально, и надеюсь не только для меня :), почему бы автору сразу не указать что это непрерывные интервалы, или это только для посвященных. :)