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

Откуда:
Сообщений: 10
Есть таблица

DateNum
01-02-20161
02-02-20161
02-02-20162
04-02-20161
08-02-20163

Нужно посчитать сколько раз каждый Num встречается без прерывания интервала дат.
Т.е. результат
DateNum Num2
01-02-20161 1
02-02-20161 2
02-02-20162 1
04-02-20161 1
08-02-201621


Как можно реализовать с помощью оконных функций? Диапазон дат я могу выбрать, а вот посчитать Num не сооброжу как.
12 апр 18, 20:53    [21334885]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
x1sf
Member

Откуда:
Сообщений: 10
SELECT P.DateOfProject, P.ProjectID, COUNT(P.ProjectID) 
            OVER(PARTITION BY P.ProjectID ORDER BY P.DateOfProject
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS DaysRow
FROM dbo.Project p


Запрос считает но без учета разрыва в датах.
Как изменить окно с учетом дат?
12 апр 18, 22:15    [21335096]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
x1sf,

set dateformat dmy
declare @t table (date datetime, Num int)

insert into @t values 
('01-02-2016',1),
('02-02-2016',1),
('02-02-2016',2), 
('04-02-2016',1),
('08-02-2016',3);

With Starts as (
Select *,
iif(lag(date) over(partition by Num order by date) = dateadd (d,-1,date),0,1) as IsStart From @t
),
Groups as (
Select *,sum(IsStart) over(partition by Num order by date) as GrID
From starts
)
Select *,count(*) over(partition by Num,GrID order by date) as Num2 From Groups
13 апр 18, 04:31    [21335324]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
court
Member

Откуда:
Сообщений: 1956
set dateformat dmy
declare @t table (date datetime, Num int)

insert into @t values 
('01-02-2016',1),
('02-02-2016',1),
('02-02-2016',2), 
('04-02-2016',1),
('08-02-2016',3);

--
;with cte as (
	select 
		*
		,inv	=date-row_number()over(partition by Num order by date)
	from	@t)

select 
	*
	,Num2	=row_number()over(partition by Num, inv order by date)   
from cte 	 
order by date 

dateNuminvNum2
2016-02-01 00:00:00.00012016-01-31 00:00:00.0001
2016-02-02 00:00:00.00012016-01-31 00:00:00.0002
2016-02-02 00:00:00.00022016-02-01 00:00:00.0001
2016-02-04 00:00:00.00012016-02-01 00:00:00.0001
2016-02-08 00:00:00.00032016-02-07 00:00:00.0001
13 апр 18, 09:54    [21335628]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
x1sf
Member

Откуда:
Сообщений: 10
Kopelly, court,

Спасибо за рабочие варианты.
Можно вопросы позадавать лично для полного понимания?

Спасибо.
14 апр 18, 00:21    [21338385]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
court
Member

Откуда:
Сообщений: 1956
x1sf,

дружище, ты живешь в свободной стране
и можешь задавать любые вопросы :(
14 апр 18, 19:41    [21339714]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
x1sf
Member

Откуда:
Сообщений: 10
Как выбрать все Num для которых в таблице есть как минимум две записи Date отстоящие друг от друга на n дней?
Т.е. Num встречается в таблице сегодня и еще n дней назад?
18 апр 18, 23:51    [21350594]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
x1sf
Как выбрать все Num для которых в таблице есть как минимум две записи Date отстоящие друг от друга на n дней?
Т.е. Num встречается в таблице сегодня и еще n дней назад?
Почитайте про "диапазоны значений" в определении окна функции. (over RANGE between)
19 апр 18, 04:09    [21350708]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оконным функциям  [new]
court
Member

Откуда:
Сообщений: 1956
x1sf
Как выбрать все Num для которых в таблице есть как минимум две записи Date отстоящие друг от друга на n дней?
Т.е. Num встречается в таблице сегодня и еще n дней назад?
имхо, в такой задаче, "оконные функции" и "рядом не стояли"

если только первую апись
select * from T t1
where exists (select 1 from T t2 where t1.Num=t2.Num and t1.Date=dateadd(day,-n,t2.Date)


если обе
select * from T t1
cross apply (select * from T t2 where t1.Num=t2.Num and t1.Date=dateadd(day,-n,t2.Date) a
19 апр 18, 09:32    [21350958]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить