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

Откуда:
Сообщений: 11
Помогите решить такую задачу.
Есть таблица с периодами YYYYMM и соответствующий периоду флаг активности 0/1.
Нужно определить количество "областей" с нулями и единицами.

201408 1
201409 1
201410 0
201411 0
201412 1
201501 0
201502 1

Здесь, например, две области неактивности: 201410-201411 и 291501.
23 фев 15, 09:17    [17300804]     Ответить | Цитировать Сообщить модератору
 Re: определить количество периодов  [new]
VGalamakh
Member

Откуда: Киев (Альба)
Сообщений: 66
Tubic,
Красивее не придумал.

declare @t table (period int, flag int)
insert @t 
VALUES 
(201408, 1),
(201409, 1),
(201410, 0),
(201411, 0),
(201412, 1),
(201501, 0),
(201502, 1)

Select * from @t

Select min(period) period, flag, period2 from (
	Select period,flag,(Select max(period) from @t b where b.period>=a.period and b.flag=0 and b.period<(Select min(period) from @t c where C.period>=a.period and C.flag=1)) period2
	from @t a
	where flag=0
	) d
group by flag,period2	
23 фев 15, 15:49    [17301626]     Ответить | Цитировать Сообщить модератору
 Re: определить количество периодов  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
WITH CTE AS
(
 SELECT * FROM
 (
  VALUES
   (201408, 1)
  ,(201409, 1)
  ,(201410, 0)
  ,(201411, 0)
  ,(201412, 1)
  ,(201501, 0)
  ,(201502, 1)
 ) T(YM,A)
)
,T AS
(
 SELECT N=ROW_NUMBER()OVER(ORDER BY YM)-ROW_NUMBER()OVER(PARTITION BY A ORDER BY YM),*
 FROM CTE
)
SELECT A,MIN(YM),MAX(YM)
FROM T
GROUP BY N,A
ORDER BY MIN(YM);
23 фев 15, 16:02    [17301673]     Ответить | Цитировать Сообщить модератору
 Re: определить количество периодов  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Tubic
Нужно определить количество "областей" с нулями и единицами.

201408 1
201409 1
201410 0
201411 0
201412 1
201501 0
201502 1



with t0([month], v) as
(
	select '201408', 1 union all
	select '201409', 1 union all
	select '201410', 0 union all
	select '201411', 0 union all
	select '201412', 1 union all
	select '201501', 0 union all
	select '201502', 1
),
t1 as
(
	select
		*,
		iif(lag(v, 1, -1) over(order by [month]) <> v, 1, 0) as is_grp_start
	from
		t0
)
select
	v, count(1) as cnt
from
	t1
where
	is_grp_start = 1
group by
	v
23 фев 15, 16:12    [17301715]     Ответить | Цитировать Сообщить модератору
 Re: определить количество периодов  [new]
Tubic
Member

Откуда:
Сообщений: 11
VGalamakh, iap, churupaha,

огромное вам спасибо!
23 фев 15, 17:12    [17301890]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить