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

Откуда:
Сообщений: 40
День добрый!

Прошу помочь с составлением запроса.

Имеется таблица

declare @t table(num int identity(1,1), TypeID int, PointTime1 datetime,PointTime2 datetime)
insert into @t
select 1, '2016-05-30 14:22:10.000', '2016-06-05 19:44:55.000'
union all
select 1, '2016-06-05 19:44:55.000', '2016-06-05 19:58:55.000'
union all
select 3, '2016-06-05 19:58:55.000', '2016-06-05 20:13:20.000'
union all
select 1, '2016-06-05 20:13:20.000', '2016-06-05 20:14:01.000'
union all
select 3, '2016-06-05 20:14:01.000', '2016-06-05 20:25:13.000'
union all
select 1, '2016-06-05 20:25:13.000', '2016-06-05 20:25:50.000'
union all
select 1, '2016-06-05 20:25:50.000', '2016-06-05 20:26:51.000'
union all
select 1, '2016-06-05 20:26:51.000', '2016-06-05 20:28:10.000'
union all
select 1, '2016-06-05 20:28:10.000', '2016-06-05 20:30:10.000'

num	TypeID		PointTime1			PointTime2
1	1		2016-05-30 14:22:10.000		2016-06-05 19:44:55.000
2	1		2016-06-05 19:44:55.000		2016-06-05 19:58:55.000
3	3		2016-06-05 19:58:55.000		2016-06-05 20:13:20.000
4	1		2016-06-05 20:13:20.000		2016-06-05 20:14:01.000
5	3		2016-06-05 20:14:01.000		2016-06-05 20:25:13.000
6	1		2016-06-05 20:25:13.000		2016-06-05 20:25:50.000
7	1		2016-06-05 20:25:50.000		2016-06-05 20:26:51.000
8	1		2016-06-05 20:26:51.000		2016-06-05 20:28:10.000
9	1		2016-06-05 20:28:10.000		2016-06-05 20:30:10.000


Нужно сгруппировать подряд идущие строки с одним типом, чтобы результат вышел вот такого вида:

num	TypeID		PointTime1			PointTime2
1	1		2016-05-30 14:22:10.000		2016-06-05 19:58:55.000
3	3		2016-06-05 19:58:55.000		2016-06-05 20:13:20.000
4	1		2016-06-05 20:13:20.000		2016-06-05 20:14:01.000
5	3		2016-06-05 20:14:01.000		2016-06-05 20:25:13.000
6	1		2016-06-05 20:25:13.000		2016-06-05 20:30:10.000


т.е. min(num), TypeID, min(PointTime1),max(PointTime2)

пробовал с DENSE_RANK() ничего не выходит, есть ли еще варианты без использования курсора?
11 окт 16, 11:36    [19768068]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по порядку  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
semI-PACK,

элементарно:

declare @t table(num int identity(1,1), TypeID int, PointTime1 datetime,PointTime2 datetime)
insert into @t
select 1, '2016-05-30 14:22:10.000', '2016-06-05 19:44:55.000'
union all
select 1, '2016-06-05 19:44:55.000', '2016-06-05 19:58:55.000'
union all
select 3, '2016-06-05 19:58:55.000', '2016-06-05 20:13:20.000'
union all
select 1, '2016-06-05 20:13:20.000', '2016-06-05 20:14:01.000'
union all
select 3, '2016-06-05 20:14:01.000', '2016-06-05 20:25:13.000'
union all
select 1, '2016-06-05 20:25:13.000', '2016-06-05 20:25:50.000'
union all
select 1, '2016-06-05 20:25:50.000', '2016-06-05 20:26:51.000'
union all
select 1, '2016-06-05 20:26:51.000', '2016-06-05 20:28:10.000'
union all
select 1, '2016-06-05 20:28:10.000', '2016-06-05 20:30:10.000';

WITH CTE AS (SELECT N=ROW_NUMBER()OVER(ORDER BY num)-ROW_NUMBER()OVER(PARTITION BY TypeID ORDER BY num),* FROM @t)
SELECT num=MIN(num), TypeID, PointTime1=MIN(PointTime1), PointTime2=MAX(PointTime2)
FROM CTE
GROUP BY N,TypeID
ORDER BY num;


100500 раз тут было. Просто надо поискать.
11 окт 16, 11:46    [19768174]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по порядку  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @t table(num int identity(1,1),	TypeID int,	PointTime1 datetime,PointTime2 datetime)
insert into @t
select 1,	'2016-05-30 14:22:10.000', '2016-06-05 19:44:55.000'
union all
select 1,	'2016-06-05 19:44:55.000', '2016-06-05 19:58:55.000'
union all
select 3,	'2016-06-05 19:58:55.000', '2016-06-05 20:13:20.000'
union all
select 1,	'2016-06-05 20:13:20.000', '2016-06-05 20:14:01.000'
union all
select 3,	'2016-06-05 20:14:01.000', '2016-06-05 20:25:13.000'
union all
select 1,	'2016-06-05 20:25:13.000', '2016-06-05 20:25:50.000'
union all
select 1,	'2016-06-05 20:25:50.000', '2016-06-05 20:26:51.000'
union all
select 1,	'2016-06-05 20:26:51.000', '2016-06-05 20:28:10.000'
union all
select 1,	'2016-06-05 20:28:10.000', '2016-06-05 20:30:10.000'

select max(typeid) as typeid,min(num) as num,min(PointTime1) as PointTime1,max(PointTime2) as PointTime2
from(
select *,sum(n) over (order by num) as g from(
select*
,case when lag(typeid) over (order by num) <> TypeID then 1 else 0 end as n
from @t
) a
) b
group by g
11 окт 16, 11:48    [19768193]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по порядку  [new]
semI-PACK
Member

Откуда:
Сообщений: 40
Благодарю
11 окт 16, 11:56    [19768266]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по порядку  [new]
Добрый Э - Эх
Guest
о-у, смотрю - оба метода прижились. и start_of_group и инвариант на разности двух разнооконных row_number-ах... ;)
11 окт 16, 12:31    [19768474]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить