none
Помогите с запросом RRS feed

  • Вопрос

  • Есть запрос который формирует следующую выборку

    Start

    1

    2

    3

    10

    20

    30

    40

    а хотелось бы чтобы он выдавал начало и конец интервала

    так

    Start            End

    1                 3

    10               40

    Очень выручите если поможете! Спасибо.

     

    30 июня 2011 г. 7:35

Ответы

  • with cte
    as
    (
    
    select row_number() over ( order by i ) id, i from @t
    union all
    select 0, -1000
    union all
    select count(*)+1,1000 from @t
    )
    
    
    select t1.i as Start, t2.i as [End] from
    (
    select row_number() over ( order by t1.i ) id, t1.i from cte t1 inner join cte t2
    on t1.id - 1 = t2.id and t1.i - 1 != t2.i
    where t1.i < 1000 
    ) t1
    inner join
    (
    select row_number() over ( order by t1.i ) id, t1.i from cte t1 inner join cte t2
    on t1.id + 1 = t2.id and t1.i + 1 != t2.i
    where t1.i > -1000
    ) t2
    on t1.id = t2.id
    
    


    http://www.t-sql.ru
    • Помечено в качестве ответа Abolmasov Dmitry 8 июля 2011 г. 7:01
    • Снята пометка об ответе zolton 11 июля 2011 г. 4:34
    • Помечено в качестве ответа Abolmasov Dmitry 18 июля 2011 г. 7:02
    7 июля 2011 г. 13:08
    Модератор

Все ответы

  • а что является признаком конца интервала?!


    http://www.t-sql.ru
    30 июня 2011 г. 8:05
    Модератор
  • select 1 as start, 3 as end
    union
    select 10 as start, 40 as end
     
    30 июня 2011 г. 8:07
    Модератор
  • сорри не так написал.

    1

    2

    3

    10

    11

    12

    13

    14

    20

    21

    22

    признаком конца будет в данном случае число разница между ним и предыдущим  > 1

    в общем нужно выбрать все интервалы с таким условием т.е.

    1                  3

    10                14

    20                22

    30 июня 2011 г. 8:22
  • 10    12

    11    13

    12    14

    Что с ними делать?

    30 июня 2011 г. 9:06
    Модератор
  • вот в выборке есть три последовательности 1,2,3  . здесь начало 1  конец 3. потом идет 10, 10 - 3 = 7, 7 > 1 значит начинается другая последовательность начало которой 10 , конец 14 и начало последней 20 и конец 22. так вот мне нужно вывести начала и концы этих последовательностей в таком виде 

    1                  3    (начало первой и конец первой последовательности)

    10                14   (начало второй  и конец второй последовательности)

    20                22    (начало третьей и конец третьей последовательности)

    ..... .....   еще последовательности

     


    30 июня 2011 г. 9:22
  • declare @t table ( i int )
    insert into @t
    values (-1000)
       , (1), (2), (3)
       , (10), (11), (12), (13), (14)
       , (20), (21), (22)
       , (30)
       , (45), (46), (47)
       , (134), (135), (136), (137), (138), (139), (140), (141), (142)
       , (555), (556)
       , (+1000);
    
    
    
    with cte
    as
    (
    select row_number() over ( order by i ) id, i from @t
    )
    
    select t1.i as Start, t2.i as [End] from
    (
    select row_number() over ( order by t1.i ) id, t1.i from cte t1 inner join cte t2
    on t1.id - 1 = t2.id and t1.i - 1 != t2.i
    where t1.i < 1000
    ) t1
    inner join
    (
    select row_number() over ( order by t1.i ) id, t1.i from cte t1 inner join cte t2
    on t1.id + 1 = t2.id and t1.i + 1 != t2.i
    where t1.i > -1000
    ) t2
    on t1.id = t2.id
    
    
    


    http://www.t-sql.ru
    • Предложено в качестве ответа yagorik 30 июня 2011 г. 12:03
    • Помечено в качестве ответа zolton 1 июля 2011 г. 9:25
    • Снята пометка об ответе zolton 7 июля 2011 г. 10:47
    30 июня 2011 г. 10:32
    Модератор
  • спасибо! попробую разобраться

    30 июня 2011 г. 11:20
  • Уважаемый пользователь, пожалуйста, не забудьте отметить ответ или ответы, которые решают вашу проблему (кнопка 'Пометить как ответ' под каждым сообщением). Спасибо.
    Для связи [mail]
    • Помечено в качестве ответа zolton 7 июля 2011 г. 10:45
    • Снята пометка об ответе zolton 7 июля 2011 г. 10:45
    30 июня 2011 г. 11:52
  • Я дико извиняюсь, а можно это сделать без обрамления  -1000 и +1000?

     

    7 июля 2011 г. 10:46
  • with cte
    as
    (
    
    select row_number() over ( order by i ) id, i from @t
    union all
    select 0, -1000
    union all
    select count(*)+1,1000 from @t
    )
    
    
    select t1.i as Start, t2.i as [End] from
    (
    select row_number() over ( order by t1.i ) id, t1.i from cte t1 inner join cte t2
    on t1.id - 1 = t2.id and t1.i - 1 != t2.i
    where t1.i < 1000 
    ) t1
    inner join
    (
    select row_number() over ( order by t1.i ) id, t1.i from cte t1 inner join cte t2
    on t1.id + 1 = t2.id and t1.i + 1 != t2.i
    where t1.i > -1000
    ) t2
    on t1.id = t2.id
    
    


    http://www.t-sql.ru
    • Помечено в качестве ответа Abolmasov Dmitry 8 июля 2011 г. 7:01
    • Снята пометка об ответе zolton 11 июля 2011 г. 4:34
    • Помечено в качестве ответа Abolmasov Dmitry 18 июля 2011 г. 7:02
    7 июля 2011 г. 13:08
    Модератор
  • скажите,а  почему на числах с плавающей точкой не работает? Дело в том что я работаю с датами в виде чисел с плавающей точкой. Поле типа float

     


    8 июля 2011 г. 12:10
  • скажите,а  почему на числах с плавающей точкой не работает? Дело в том что я работаю с датами в виде чисел с плавающей точкой. Поле типа float

     



    а как связана дата в виде числа с плавающей точкой и ваш первоначальный вопрос?!
    http://www.t-sql.ru
    Модератор
  • для простоты изложил в целых числах. у меня есть интервалы дат записанные в виде float. думал что проблем не возникнет с использованием чисел типа float.  Вам спасибо.! на целых работает супер. не могу понять в чем проблема. такое подозрение что сравнение на float - ах не правильно работает.  
    9 июля 2011 г. 13:15
  • float - не точный тип данных, а приблизительный, поэтому и точные сранвнения с ним могут не работать. Используйте сравнение с погрешностью или замените float на точный decimal.


    Для связи [mail]
    12 июля 2011 г. 12:00