Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по оконным функциям / 9 сообщений из 9, страница 1 из 1
12.04.2018, 20:53
    #39629485
x1sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
Есть таблица

DateNum01-02-2016102-02-2016102-02-2016204-02-2016108-02-20163
Нужно посчитать сколько раз каждый Num встречается без прерывания интервала дат.
Т.е. результат
DateNum Num201-02-20161 102-02-20161 202-02-20162 104-02-20161 108-02-201621

Как можно реализовать с помощью оконных функций? Диапазон дат я могу выбрать, а вот посчитать Num не сооброжу как.
...
Рейтинг: 0 / 0
12.04.2018, 22:15
    #39629522
x1sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
Код: sql
1.
2.
3.
4.
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



Запрос считает но без учета разрыва в датах.
Как изменить окно с учетом дат?
...
Рейтинг: 0 / 0
13.04.2018, 04:31
    #39629567
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
x1sf,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
13.04.2018, 09:54
    #39629652
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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 


dateNuminvNum22016-02-01 00:00:00.00012016-01-31 00:00:00.00012016-02-02 00:00:00.00012016-01-31 00:00:00.00022016-02-02 00:00:00.00022016-02-01 00:00:00.00012016-02-04 00:00:00.00012016-02-01 00:00:00.00012016-02-08 00:00:00.00032016-02-07 00:00:00.0001
...
Рейтинг: 0 / 0
14.04.2018, 00:21
    #39630130
x1sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
Kopelly, court,

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

Спасибо.
...
Рейтинг: 0 / 0
14.04.2018, 19:41
    #39630304
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
x1sf,

дружище, ты живешь в свободной стране
и можешь задавать любые вопросы :(
...
Рейтинг: 0 / 0
18.04.2018, 23:51
    #39632878
x1sf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
Как выбрать все Num для которых в таблице есть как минимум две записи Date отстоящие друг от друга на n дней?
Т.е. Num встречается в таблице сегодня и еще n дней назад?
...
Рейтинг: 0 / 0
19.04.2018, 04:09
    #39632898
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
x1sfКак выбрать все Num для которых в таблице есть как минимум две записи Date отстоящие друг от друга на n дней?
Т.е. Num встречается в таблице сегодня и еще n дней назад?Почитайте про "диапазоны значений" в определении окна функции. (over RANGE between)
...
Рейтинг: 0 / 0
19.04.2018, 09:32
    #39632963
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оконным функциям
x1sfКак выбрать все Num для которых в таблице есть как минимум две записи Date отстоящие друг от друга на n дней?
Т.е. Num встречается в таблице сегодня и еще n дней назад?имхо, в такой задаче, "оконные функции" и "рядом не стояли"

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



если обе
Код: sql
1.
2.
select * from T t1
cross apply (select * from T t2 where t1.Num=t2.Num and t1.Date=dateadd(day,-n,t2.Date) a
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по оконным функциям / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]