나는 일부 윈도우 함수 알고리즘을 사용할 것입니다.
입력 테스트 데이터 :
create table tt (key varchar(10), dte date);
insert into tt values ('w1', '2017-12-01');
insert into tt values ('w1', '2017-11-01');
insert into tt values ('w1', '2015-12-01');
insert into tt values ('w1', '2015-11-01');
insert into tt values ('w1', '2016-01-01');
insert into tt values ('w1', '2016-02-01');
insert into tt values ('w1', '2016-05-01');
insert into tt values ('w1', '2016-06-01');
insert into tt values ('w2', '2016-02-01');
insert into tt values ('w2', '2016-03-01');
insert into tt values ('w2', '2016-05-01');
insert into tt values ('w3', '2016-01-01');
insert into tt values ('w3', '2016-02-01');
그런 다음 우리는 지속적인 작업 시간을 retreive하는 날짜 사이의 그룹을 만들려면 윈도우 함수를 사용합니다.
여기서부터는 표현식으로 다른 그룹과 함께 count - 1을 수행하면됩니다.
with tmp as (
select key,
dte,
dte - (row_number() over(partition by key order by dte) MONTHS) as rnk_month,
row_number() over(partition by key order by dte) as rnk_tot
from tt)
select key, min(dte), max(dte), rnk_month
from tmp
group by key, rnk_month
order by key, rnk_month
sqlServer를 사용하여 쿼리 시도 구문 ...
기능 : ROW_NUMBER() (DTE에 의해 키 순서로 파티션) 이상이 outpout합니다
with tmp as (
select key,
dte,
dateadd(month, - row_number() over(partition by key order by dte), dte) as rnk_month,
row_number() over(partition by key order by dte) as rnk_tot
from tt)
select key, min(dte), max(dte), rnk_month
from tmp
group by key, rnk_month
order by key, rnk_month
이 좀 더 설명하기 위해 (내가 SQL을이없는까지 확실하지가 작동합니다) 작업자 1 : 우리는 한 달에로 rnk_tot 고려 rnk_tot와 날짜를 빼지 경우 지금
-----------------------------
Worker | Month | rnk_tot
-----------------------------
w1 |2015-11-01 | 1
w1 |2015-12-01 | 2
w1 |2016-01-01 | 3
w1 |2016-02-01 | 4
w1 |2016-05-01 | 5
w1 |2016-06-01 | 6
w1 |2017-11-01 | 7
w1 |2017-12-01 | 8
, 우리는 몇 가지 연속 그룹을 형성 몇 가지 새로운 날짜가됩니다
를
----------------------------------------
Worker | Mth Min | Mth Max | rnk_month
----------------------------------------
w1 |2015-11-01 |2016-02-01|2015-10-01
w1 |2016-05-01 |2016-06-01|2015-12-01
w1 |2017-11-01 |2017-12-01|2017-04-01
를 그리고 여기에서 당신이 수를 할 수 있습니다 :
----------------------------------------
Worker | Month | rnk_tot | rnk_month
----------------------------------------
w1 |2015-11-01 | 1 |2015-10-01
w1 |2015-12-01 | 2 |2015-10-01
w1 |2016-01-01 | 3 |2015-10-01
w1 |2016-02-01 | 4 |2015-10-01
w1 |2016-05-01 | 5 |2015-12-01
w1 |2016-06-01 | 6 |2015-12-01
w1 |2017-11-01 | 7 |2017-04-01
w1 |2017-12-01 | 8 |2017-04-01
는 여기에서 (즉, 내가 게시 된 쿼리가하는 일입니다) 작업자 및 gatter 연속 작업 시간에 rnk_month 열에 의해 그룹을 할 수 틈새의. 그래서 최종 쿼리 수 :
내가 사용하는 테스트 케이스에 대한이 출력 줄 것이다
with tmp as (
select key,
dateadd(month, - row_number() over(partition by key order by dte), dte) as rnk_month
from tt)
select key, count(distinct rnk_month) - 1 as gaps
from tmp
group by key
:
-----------------
Worker | Gaps
-----------------
w1 | 2
w2 | 1
w3 | 0
가 어떻게 'worker001'의 "1"의 값을받을 수 있나요을? 또한 사용중인 데이터베이스에 질문을 태그하십시오. –
어떤 DBMS를 사용하고 있습니까? –
알고리즘이 변경되면 작동해야합니까? – Nemeros