내가 올바르게 이해했다면, 나머지 숫자로 항목을 그룹화 한 다음 최소 날짜 + 1 일 및 "다음"나머지 숫자의 최소 날짜를 표시하려고합니다. 두 개의 다른 장소에서 Rest 번호가 0 일 때 어떻게 될 것으로 예상됩니까?
with Base as
(
select t.AccNum,
t.Rest,
DATEADD(day, 1, MIN(t.Date)) as [StartDate],
ROW_NUMBER() OVER (ORDER BY MIN(t.Date)) as RowNumber
from Accounts t
where t.Rest <> 0
group by t.AccNum, t.Rest
)
select a.AccNum, a.Rest, a.StartDate, DATEADD(DAY, -1, b.StartDate) as [EndDate]
from Base a
left join Base b
on a.RowNumber = b.RowNumber - 1
order by a.[StartDate]
가 나머지 번호가 더 아래 중복 될 가능성이지만, 별도의 항목이 될 필요가 있음을, 우리는 우리의 초기 선택 쿼리에서 조금 더 영리해야합니다. 두 쿼리에 대한
with Base as
(
select b.AccNum, b.Rest, MIN(DATEADD(day, 1, b.Date)) as [StartDate], ROW_NUMBER() OVER (ORDER BY MIN(Date)) as [RowNumber]
from (
select *, ROW_NUMBER() OVER (PARTITION BY Rest ORDER BY Date) - ROW_NUMBER() OVER (ORDER BY Date) as [Order]
from Accounts a
-- where a.Rest <> 0
-- If we're still filtering out Rest 0 uncomment the above line
) b
group by [order], AccNum, Rest
)
select a.RowNumber, a.AccNum, a.Rest, a.StartDate, DATEADD(DAY, -1, b.StartDate) as [EndDate]
from Base a
left join Base b
on a.RowNumber = b.RowNumber - 1
order by a.[StartDate]
결과 :
Account Number REST Start Date End Date
45817840200000057948 2500 2013-01-01 2013-01-14
45817840200000057948 1181 2013-01-15 2013-01-31
45817840200000057948 2431 2013-02-01 2013-02-09
45817840200000057948 1563 2013-02-10 NULL
1. 당신은 샘플 데이터의 작은 비트를 게시 더 잘하고 (임의 문서를 다운로드하는 사람을 기대하지 않습니다 예) SO에 출력을 직접 예상 2 당신이 한 어떤 시도라도 보는 것이 좋을 것입니다. –
그것은 내가 10보다 작은 reoutation을 가지고 있기 때문에 데이터를 보여줄 수있는 유일한 방법은 Google 드라이브입니다. –
표 1 a, 표 1 b 에서 a.accNumber, a.Rest, min (a.Date), min (b.Date)을 선택하십시오. b.Date> a.Date 및 a.accNumber = b.accNumber 및 a .Rest <> b.Rest Group by a.accNumber, a.Rest a.accNumber, 3 –