Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
blest Member Откуда: Сообщений: 554 |
Задача в теме, т.е. из 1 1 2 1 3 3 2 Необходимо получить 1 2 1 3 2 |
9 ноя 12, 12:50 [13445449] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37138 |
У вас нет поля, которое задает последовательность. |
9 ноя 12, 12:51 [13445467] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
blest, как найдешь критерий сортировки, дающий так результат, так можно будет задействовать метод инварианта группы. :) А если версия сервера позволяет, то и "метод начала групп" |
9 ноя 12, 13:00 [13445553] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
А, ну да, забыл добавить: "Фигня это фсе. На больших размерах данных тупо просрет временным таблицам"© aleks2 ![]() |
||
9 ноя 12, 13:21 [13445809] Ответить | Цитировать Сообщить модератору |
blest Member Откуда: Сообщений: 554 |
5
Я вроде указал критерий сортировки. По указанным ссылкам ничего не понял(( |
||
9 ноя 12, 19:10 [13448862] Ответить | Цитировать Сообщить модератору |
ROLpogo Member Откуда: Реутов Сообщений: 219 |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||||
10 ноя 12, 10:16 [13451078] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||
10 ноя 12, 10:38 [13451097] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |