如果我正确地理解了你,你想按照其余的号码对这些项目进行分组,然后显示最短日期+ 1天以及“下一个”休息数的最短日期。当两个不同的地方的休息数是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 。看到你所做的任何尝试都会很高兴。 –
它不允许放在这里,因为我的reoutation小于10,显示数据的唯一方法是谷歌驱动器。 –
select a.accNumber,a.Rest,min(a.Date),min(b.Date)from Table1 a,Table1 b where b.date> a.Date and a.accNumber = b.accNumber and a .Rest <> b.Rest Group by a.accNumber,a.Rest order by a.accNumber,3 –