powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / rolling count by date periods
11 сообщений из 11, страница 1 из 1
rolling count by date periods
    #39573962
Igor0000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
rolling count by date periods
    #39573976
Igor0000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
rolling count by date periods
    #39574030
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor0000,

Сформулируйте условие более точно. А то у вас тут периоды пересекаются, очень много пограничных случаев может быть.
...
Рейтинг: 0 / 0
rolling count by date periods
    #39574035
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
rolling count by date periods
    #39574048
Igor0000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Spasibo za otvet,

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

moget, mojno bez subquery sdelat'? cherez count() over()?
Можно, если будет уникальный ключ в исходной таблице.
...
Рейтинг: 0 / 0
rolling count by date periods
    #39574054
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.
	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
rolling count by date periods
    #39574059
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
rolling count by date periods
    #39574061
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor0000,

Скорее всего нет, вам нужно проверять условие пересечения периодов
...
Рейтинг: 0 / 0
rolling count by date periods
    #39574138
Igor0000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
rolling count by date periods
    #39574143
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor0000Mojno

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


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