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

Откуда:
Сообщений: 554
Задача в теме, т.е. из
1
1
2
1
3
3
2
Необходимо получить
1
2
1
3
2
9 ноя 12, 12:50    [13445449]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37075
У вас нет поля, которое задает последовательность.
9 ноя 12, 12:51    [13445467]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
blest
Member

Откуда:
Сообщений: 554
Гавриленко Сергей Алексеевич
У вас нет поля, которое задает последовательность.


Да, действительно не указал. Поле создающее последовательность - дата создания строки. Т.е.

1 2012-11-08 15:00
1 2012-11-08 16:00
2 2012-11-08 17:00
1 2012-11-08 18:00
и т.д.
9 ноя 12, 13:00    [13445549]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
Добрый Э - Эх
Guest
blest,

как найдешь критерий сортировки, дающий так результат, так можно будет задействовать метод инварианта группы. :)
А если версия сервера позволяет, то и "метод начала групп"
9 ноя 12, 13:00    [13445553]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
blest,

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


А, ну да, забыл добавить:
"Фигня это фсе. На больших размерах данных тупо просрет временным таблицамaleks2
9 ноя 12, 13:21    [13445809]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
blest
Member

Откуда:
Сообщений: 554
5
Добрый Э - Эх
blest,

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


Я вроде указал критерий сортировки. По указанным ссылкам ничего не понял((
9 ноя 12, 19:10    [13448862]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 216
create table #T
(
  I int,
  D datetime
)

create table #Result
(
  I int
)

insert into #T(I, D) values(1, '20121108 15:00'),
                           (1, '20121108 16:00'),
                           (2, '20121108 17:00'),
                           (1, '20121108 18:00'),
                           (3, '20121108 19:00'),
                           (3, '20121108 20:00'),
                           (2, '20121108 21:00')
declare @I     int,
        @I_Old int = 0

declare curD cursor for
  select I from #T order by D

open curD
while 1 = 1
begin
  fetch next from curD into @I
  if @@fetch_status != 0
    break

  if @I_Old != @I
  begin
    insert into #Result(I) values (@I)
    set @I_Old = @I
  end
end
close      curD
deallocate curD

select I from #Result

drop table #T
drop table #Result
10 ноя 12, 02:18    [13450681]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
qwerty112
Guest
select *
from

(select top 1 with ties I, D
from

(select *, 
row_number() over (order by D) - row_number() over (partition by I order by D) as rn
from @t ) a

order by row_number() over (partition by I, rn order by D)) b

order by D

I           D
----------- -----------------------
1           2012-11-08 15:00:00.000
2           2012-11-08 17:00:00.000
1           2012-11-08 18:00:00.000
3           2012-11-08 19:00:00.000
2           2012-11-08 21:00:00.000
10 ноя 12, 10:13    [13451074]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
Добрый Э - Эх
Guest
blest
Я вроде указал критерий сортировки.
Посмотри на время твоего и моего постов, сравни их ID и ты поймешь, что писали мы одновременно, соответственно, в момент написания своего ответа твоего поста я ещё просто не мог видеть.

blest
По указанным ссылкам ничего не понял((
То есть, нужно готовый запрос тебе написать?
10 ноя 12, 10:16    [13451078]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
Добрый Э - Эх
Guest
Ну, раз инвариант уже показали, осталось показать начало группы:
--
-- Тестовый набор данных:
with
  t (i,d) as
    (
      select *
       from (values
               (1, '20121108 15:00'),
               (1, '20121108 16:00'),
               (1, '20121108 16:30'),
               (2, '20121108 17:00'),
               (2, '20121108 17:10'),
               (2, '20121108 17:20'),
               (2, '20121108 17:30'),
               (1, '20121108 18:00'),
               (1, '20121108 18:15'),
               (1, '20121108 18:25'),
               (3, '20121108 19:00'),
               (3, '20121108 20:00'),
               (2, '20121108 21:00'),
               (2, '20121108 21:05'),
               (2, '20121108 21:10') 
             ) as v(i,d)
             
      )
--
-- Основной запрос
select i, max(d) as beg_date, min(d) as end_date, count(1) as i_cnt
  from (
         select i,d, 
                sum(start_of_group) over(order by d) as grp_id -- Формирование идентификатора группы последовательно идущих данных
           from (
                  select t.*, 
                         case lag(i) over(order by d) 
                           when i
                             then 0
                           else 1 
                         end as start_of_group -- Флаг начала группы последовательно идущих данных
                    from t
                ) as v0
       ) as v1
 group by i, grp_id
10 ноя 12, 10:37    [13451095]     Ответить | Цитировать Сообщить модератору
 Re: Группировка последовательно идущих данных  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Ну, раз инвариант уже показали, осталось показать начало группы:
З.Ы. Наличие MS SQL Server 2012 - обязательно!
10 ноя 12, 10:38    [13451097]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить