당신은 비교적 간단한 방법으로이 작업을 수행 할 수있는 기능 할 수있을 것 기간 당 계정 당 행.
다음은 예입니다. 의 일부 임시 테이블을 설정하자
insert into #yourtable (balance, date, aid) values (4,'2009-01-01',1)
insert into #yourtable (balance, date, aid) values (5,'2009-01-10',1)
insert into #yourtable (balance, date, aid) values (6,'2009-01-10',1)
insert into #yourtable (balance, date, aid) values (7,'2009-01-16',1)
insert into #yourtable (balance, date, aid) values (2,'2009-01-01',2)
insert into #yourtable (balance, date, aid) values (3,'2009-01-10',2)
insert into #yourtable (balance, date, aid) values (4,'2009-01-10',2)
insert into #yourtable (balance, date, aid) values (5,'2009-01-16',2)
insert into #period (startdt, enddt) values ('2009-01-01','2009-01-06')
insert into #period (startdt, enddt) values ('2009-01-06','2009-01-11')
insert into #period (startdt, enddt) values ('2009-01-11','2009-01-16')
insert into #period (startdt, enddt) values ('2009-01-16','2009-01-21')
이제
의 모든 기간 조회 할 수 있습니다 :의 말 이전
from #period p
각 균형을 하나 개의 행을 추가하기
create table #balance (
id int identity,
balance float,
date datetime,
aid int
)
create table #period (
id int identity,
startdt datetime,
enddt datetime
)
는 몇 가지 테스트 데이터를 입력 기간 :
left join #balance b1 on
b1.date <= p.enddt
바다 처음부터 균형이 참여 사이에 균형을위한 RCH 및 기간의 종료 :
left join #balance b2 on
b2.aid = b1.aid
and b1.id < b2.id
and b2.date <= p.enddt
그런 다음 자신의 기간에 대해 마지막으로 균형을하지 않는 행을 필터링 할 수 있습니다.
where
b2.aid is null
B2를은 기본적으로 "그 사이"값을 찾습니다, 그것은 아이디가 null의 말해서, 당신이 행이 존재에-사이에 말을 가입 할 수 있습니다. 마지막 쿼리는 다음과 같습니다.
select
b1.aid
, p.startdt
, b1.balance
from #period p
left join #balance b1 on
b1.date <= p.enddt
left join #balance b2 on
b2.aid = b1.aid
and b1.id < b2.id
and b2.date <= p.enddt
where
b2.aid is null
order by b1.aid, p.startdt
참고 : 쿼리는 나중에 더 큰 ID로 항상 균형을 유지합니다.정확히 같은 종료일로 잔액을 조정할 필요가 없다면 "b1.id < b2.id"를 "b1.date < b2.date"로 바꿀 수 있습니다.
ool이 내 것보다 낫습니다. "별개의 보조 기능"을 수행하지 않고 공동 참여가 더 빠를 수도 있습니다. 내 검색어를 바꿀 수 있습니까? – Andomar
@Andomar : 그래, 자유롭게. 때로는 데이터에 따라 한 가지 방법이 다른 것보다 더 빠를 수도 있지만. 대부분의 경우 LEFT OUTER JOIN이 더 빠르다고 느낍니다. –
고마워요, 편집 됨. 같은 날짜의 잔액이 여러 개 있기 때문에 테스트 데이터가 작동하지 않는 날짜 확인이 필요합니다. – Andomar