Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / rolling count by date periods / 11 сообщений из 11, страница 1 из 1
21.12.2017, 18:33:57
    #39573962
Igor0000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
vsem privet.

est' (dannie mogut bit' drugimi, eto prosto primer)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select * from
(values
	(1, '1/1/2004', '3/1/2004', 3),
	(1, '1/1/2004', '3/1/2004', 3),
	(1, '1/1/2004', '3/1/2004', 3),
	(1, '1/1/2004', '6/1/2004', 6),
	(1, '1/1/2004', '6/1/2004', 6),
	(1, '1/1/2004', '6/1/2004', 6),
	(1, '7/1/2004', '9/1/2004', 3),
	(1, '7/1/2004', '9/1/2004', 3),
	(1, '7/1/2004', '9/1/2004', 3),
	(1, '1/1/2004', '12/1/2004', 12),
	(1, '1/1/2004', '12/1/2004', 12),
	(1, '1/1/2004', '12/1/2004', 12),
	(2, '1/1/2005', '3/1/2005', 3),
	(2, '1/1/2005', '3/1/2005', 3),
	(2, '1/1/2005', '3/1/2005', 3),
	(2, '1/1/2005', '6/1/2005', 6),
	(2, '1/1/2005', '6/1/2005', 6),
	(2, '1/1/2005', '6/1/2005', 6),
	(2, '1/1/2005', '9/1/2005', 3),
	(2, '1/1/2005', '9/1/2005', 3),
	(2, '1/1/2005', '9/1/2005', 3),
	(2, '1/1/2005', '12/1/2005', 12),
	(2, '1/1/2005', '12/1/2005', 12),
	(2, '1/1/2005', '12/1/2005', 12)

) t (id, begdt, enddt, nm)



dla zapisey s odinakovim id nado naity summarniy count strok predidushih periodov sortiruja po"nm". esli begdt, enddt ne vhodit v diapazon sleduushego nm, to ego v count dobavlat ne nado. dolgno puluchitsa

1 1/1/2004 3/1/2004 3 0
1 1/1/2004 3/1/2004 3 0
1 1/1/2004 3/1/2004 3 0
1 1/1/2004 6/1/2004 6 3
1 1/1/2004 6/1/2004 6 3
1 1/1/2004 6/1/2004 6 3
1 7/1/2004 9/1/2004 3 0
1 7/1/2004 9/1/2004 3 0
1 7/1/2004 9/1/2004 3 0
1 1/1/2004 12/1/2004 12 9
1 1/1/2004 12/1/2004 12 9
1 1/1/2004 12/1/2004 12 9
2 1/1/2005 3/1/2005 3 0
2 1/1/2005 3/1/2005 3 0
2 1/1/2005 3/1/2005 3 0
2 1/1/2005 6/1/2005 6 6
2 1/1/2005 6/1/2005 6 6
2 1/1/2005 6/1/2005 6 6
2 1/1/2005 9/1/2005 3 0
2 1/1/2005 9/1/2005 3 0
2 1/1/2005 9/1/2005 3 0
2 1/1/2005 12/1/2005 12 9
2 1/1/2005 12/1/2005 12 9
2 1/1/2005 12/1/2005 12 9


spasibo
...
Рейтинг: 0 / 0
21.12.2017, 18:45:01
    #39573976
Igor0000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Sorry, ploho pereneslos' iz excel. date format yyyy-mm-dd

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	select * from
	(values
		(1, '2004-01-01', '2004-03-01', 3),
		(1, '2004-01-01', '2004-03-01', 3),
		(1, '2004-01-01', '2004-03-01', 3),
		(1, '2004-01-01', '2004-06-01', 6),
		(1, '2004-01-01', '2004-06-01', 6),
		(1, '2004-01-01', '2004-06-01', 6),
		(1, '2004-07-01', '2004-09-01', 3),
		(1, '2004-07-01', '2004-09-01', 3),
		(1, '2004-07-01', '2004-09-01', 3),
		(1, '2004-01-01', '2004-12-01', 12),
		(1, '2004-01-01', '2004-12-01', 12),
		(1, '2004-01-01', '2004-12-01', 12),
		(2, '2004-01-01', '2004-03-01', 3),
		(2, '2004-01-01', '2004-03-01', 3),
		(2, '2004-01-01', '2004-03-01', 3),
		(2, '2004-01-01', '2004-06-01', 6),
		(2, '2004-01-01', '2004-06-01', 6),
		(2, '2004-01-01', '2004-06-01', 6),
		(2, '2004-01-01', '2004-09-01', 3),
		(2, '2004-01-01', '2004-09-01', 3),
		(2, '2004-01-01', '2004-09-01', 3),
		(2, '2004-01-01', '2004-12-01', 12),
		(2, '2004-01-01', '2004-12-01', 12),
		(2, '2004-01-01', '2004-12-01', 12)
    
	) t (id, begdt, enddt, nm)
...
Рейтинг: 0 / 0
21.12.2017, 20:14:34
    #39574030
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Igor0000,

Сформулируйте условие более точно. А то у вас тут периоды пересекаются, очень много пограничных случаев может быть.
...
Рейтинг: 0 / 0
21.12.2017, 20:34:14
    #39574035
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with cte as
(
select * from
	(values
		(1, '2004-01-01', '2004-03-01', 3),
		(1, '2004-01-01', '2004-03-01', 3),
		(1, '2004-01-01', '2004-03-01', 3),
		(1, '2004-01-01', '2004-06-01', 6),
		(1, '2004-01-01', '2004-06-01', 6),
		(1, '2004-01-01', '2004-06-01', 6),
		(1, '2004-07-01', '2004-09-01', 3),
		(1, '2004-07-01', '2004-09-01', 3),
		(1, '2004-07-01', '2004-09-01', 3),
		(1, '2004-01-01', '2004-12-01', 12),
		(1, '2004-01-01', '2004-12-01', 12),
		(1, '2004-01-01', '2004-12-01', 12),
		(2, '2004-01-01', '2004-03-01', 3),
		(2, '2004-01-01', '2004-03-01', 3),
		(2, '2004-01-01', '2004-03-01', 3),
		(2, '2004-01-01', '2004-06-01', 6),
		(2, '2004-01-01', '2004-06-01', 6),
		(2, '2004-01-01', '2004-06-01', 6),
		(2, '2004-01-01', '2004-09-01', 3),
		(2, '2004-01-01', '2004-09-01', 3),
		(2, '2004-01-01', '2004-09-01', 3),
		(2, '2004-01-01', '2004-12-01', 12),
		(2, '2004-01-01', '2004-12-01', 12),
		(2, '2004-01-01', '2004-12-01', 12)
    
	) t (id, begdt, enddt, nm)
)
select *, (select count(*) from cte c2 where c2.id = c.id and c.begdt <= c2.enddt and c.enddt >= c2.begdt and c2.nm < c.nm)
from cte c
...
Рейтинг: 0 / 0
21.12.2017, 21:14:58
    #39574048
Igor0000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Spasibo za otvet,

moget, mojno bez subquery sdelat'? cherez count() over()?
...
Рейтинг: 0 / 0
21.12.2017, 21:26:00
    #39574052
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Igor0000Spasibo za otvet,

moget, mojno bez subquery sdelat'? cherez count() over()?
Можно, если будет уникальный ключ в исходной таблице.
...
Рейтинг: 0 / 0
21.12.2017, 21:28:52
    #39574054
Igor0000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	select * from
	(values
		(1, '2004-01-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-02-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-03-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-04-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-05-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-06-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-07-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-08-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-09-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-10-01', '2004-01-01', '2004-12-01', 12),
		(1, '2004-11-01', '2004-01-01', '2004-12-01', 12),
		(1, '2004-12-01', '2004-01-01', '2004-12-01', 12),
		(2, '2005-01-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-02-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-03-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-04-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-05-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-06-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-07-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-08-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-09-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-10-01', '2005-10-01', '2005-12-01', 3),
		(2, '2005-11-01', '2005-10-01', '2005-12-01', 3),
		(2, '2005-12-01', '2005-10-01', '2005-12-01', 3)
    
	) t (id, dt, begdt, enddt, nm)



Unique key is dt
...
Рейтинг: 0 / 0
21.12.2017, 21:39:42
    #39574059
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Igor0000,

Если я правильно понял задачу, то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
IF OBJECT_ID('tempdb..#periods') IS NOT NULL DROP TABLE #periods
CREATE TABLE #periods (
  id    int,
  dt    datetime,
  begdt datetime,
  enddt datetime,
  nm    int
)
INSERT #periods (id, dt, begdt, enddt, nm) VALUES
        (1, '2004-01-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-02-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-03-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-04-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-05-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-06-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-07-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-08-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-09-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-10-01', '2004-01-01', '2004-12-01', 12),
		(1, '2004-11-01', '2004-01-01', '2004-12-01', 12),
		(1, '2004-12-01', '2004-01-01', '2004-12-01', 12),
		(2, '2005-01-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-02-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-03-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-04-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-05-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-06-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-07-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-08-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-09-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-10-01', '2005-10-01', '2005-12-01', 3),
		(2, '2005-11-01', '2005-10-01', '2005-12-01', 3),
		(2, '2005-12-01', '2005-10-01', '2005-12-01', 3)
SELECT P.id, P.begdt, P.enddt, P.nm, ISNULL(COUNT(C.id),0) AS cnt
FROM #periods P
LEFT JOIN #periods C ON C.id=P.id AND C.enddt<P.enddt
  AND C.begdt BETWEEN P.begdt AND P.enddt AND C.nm<P.nm
GROUP BY P.dt, P.id, P.begdt, P.enddt, P.nm
ORDER BY P.id, P.enddt, P.begdt, P.nm
...
Рейтинг: 0 / 0
21.12.2017, 21:41:31
    #39574061
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Igor0000,

Скорее всего нет, вам нужно проверять условие пересечения периодов
...
Рейтинг: 0 / 0
22.12.2017, 01:21:26
    #39574138
Igor0000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Mojno

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
with cte as
(
	select * from
	(values
		(1, '2004-01-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-02-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-03-01', '2004-01-01', '2004-03-01', 3),
		(1, '2004-04-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-05-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-06-01', '2004-01-01', '2004-06-01', 6),
		(1, '2004-07-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-08-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-09-01', '2004-07-01', '2004-09-01', 3),
		(1, '2004-10-01', '2004-01-01', '2004-12-01', 12),
		(1, '2004-11-01', '2004-01-01', '2004-12-01', 12),
		(1, '2004-12-01', '2004-01-01', '2004-12-01', 12),
		(2, '2005-01-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-02-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-03-01', '2005-01-01', '2005-03-01', 3),
		(2, '2005-04-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-05-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-06-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-07-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-08-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-09-01', '2005-01-01', '2005-12-01', 12),
		(2, '2005-10-01', '2005-10-01', '2005-12-01', 3),
		(2, '2005-11-01', '2005-10-01', '2005-12-01', 3),
		(2, '2005-12-01', '2005-10-01', '2005-12-01', 3),
		(3, '2006-01-01', '2006-01-01', '2006-03-01', 3),
		(3, '2006-02-01', '2006-01-01', '2006-03-01', 3),
		(3, '2006-03-01', '2006-01-01', '2006-03-01', 3),
		(3, '2006-04-01', '2006-03-01', '2006-06-01', 3),
		(3, '2006-05-01', '2006-03-01', '2006-06-01', 3),
		(3, '2006-06-01', '2006-03-01', '2006-06-01', 3),
		(3, '2006-07-01', '2006-01-01', '2006-09-01', 9),
		(3, '2006-08-01', '2006-01-01', '2006-09-01', 9),
		(3, '2006-09-01', '2006-01-01', '2006-09-01', 9),
		(3, '2006-10-01', '2006-01-01', '2006-12-01', 12),
		(3, '2006-11-01', '2006-01-01', '2006-12-01', 12),
		(3, '2006-12-01', '2006-01-01', '2006-12-01', 12)
    
	) t (id, dt, begdt, enddt, nm)

) 

select 
	id, dt, begdt, enddt, nm,
	sum(EC) over(partition by ID, SubGroupID) ExistingCount
from 
( --b
	select *,  
		case when SubGroupID = 1 or SubGroupID = lag(SubGroupID, 1, NULL) over(partition by id order by dt)
			 then 0 else lag(SubEndDTGroupIDCnt, 1, NULL) over(partition by id order by SubEndDTGroupIDCnt) end EC
	from 
	( --a
		select *,
			dense_rank() over (partition by ID order by nm) SubGroupID,
			row_number() over (partition by ID order by enddt, dt) SubEndDTGroupIDCnt
		from cte
	) a
) b
order by id, dt 
...
Рейтинг: 0 / 0
22.12.2017, 01:59:15
    #39574143
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rolling count by date periods
Igor0000Mojno

Вообще-то тут два вложенных подзапроса.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / rolling count by date periods / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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