Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Igor0000
Guest |
vsem privet. est' (dannie mogut bit' drugimi, eto prosto primer) 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 |
21 дек 17, 18:33 [21053205] Ответить | Цитировать Сообщить модератору |
Igor0000
Guest |
Sorry, ploho pereneslos' iz excel. date format yyyy-mm-ddselect * 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) |
21 дек 17, 18:45 [21053235] Ответить | Цитировать Сообщить модератору |
Remind Member Откуда: UK Сообщений: 523 |
Igor0000, Сформулируйте условие более точно. А то у вас тут периоды пересекаются, очень много пограничных случаев может быть. |
21 дек 17, 20:14 [21053563] Ответить | Цитировать Сообщить модератору |
Remind Member Откуда: UK Сообщений: 523 |
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 |
21 дек 17, 20:34 [21053614] Ответить | Цитировать Сообщить модератору |
Igor0000
Guest |
Spasibo za otvet, moget, mojno bez subquery sdelat'? cherez count() over()? |
21 дек 17, 21:14 [21053714] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Можно, если будет уникальный ключ в исходной таблице. |
||
21 дек 17, 21:26 [21053743] Ответить | Цитировать Сообщить модератору |
Igor0000
Guest |
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 |
21 дек 17, 21:28 [21053754] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Igor0000, Если я правильно понял задачу, то так: 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 |
21 дек 17, 21:39 [21053779] Ответить | Цитировать Сообщить модератору |
Remind Member Откуда: UK Сообщений: 523 |
Igor0000, Скорее всего нет, вам нужно проверять условие пересечения периодов |
21 дек 17, 21:41 [21053785] Ответить | Цитировать Сообщить модератору |
Igor0000
Guest |
Mojnowith 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 |
22 дек 17, 01:21 [21054086] Ответить | Цитировать Сообщить модератору |
ptr128 Member Откуда: Moscow Сообщений: 887 |
Вообще-то тут два вложенных подзапроса. |
||
22 дек 17, 01:59 [21054114] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |