對不起,您對上一條評論的回覆緩慢;我在週末開始工作/離開。根據我之前的回答,你可以實現的是什麼,但是我懷疑下面的代碼會更有效率/可讀性。下面的代碼的缺點是這依賴於新的SQL 2012 LAG和LEAD特性。
你可以在這些功能的閱讀在這裏:在SQL http://blog.sqlauthority.com/2011/11/15/sql-server-introduction-to-lead-and-lag-analytic-functions-introduced-in-sql-server-2012/
信息2012的許可在這裏,你應該選擇升級:http://www.microsoft.com/sqlserver/en/us/get-sql-server/how-to-buy.aspx
顯然,有很多原因,升級未必是合理的,但思想我會提供這個答案,以防它可以爲您或其他人尋找這個解決方案提供一個選項:
--Sample Data Setup:
if object_id('demo') is not null drop table demo
go
create table demo
(
id bigint identity(1,1) not null primary key clustered
, groupId nchar not null
, startDate date not null constraint uk_demo_startDate unique
)
go
insert demo
select 'A', '2009-01-01'
union all select 'A', '2009-01-02'
union all select 'A', '2009-02-01'
union all select 'B', '2009-03-01'
union all select 'B', '2009-04-01'
union all select 'B', '2009-05-01'
union all select 'C', '2009-06-01'
union all select 'C', '2009-07-01'
union all select 'C', '2009-08-01'
union all select 'A', '2009-09-01'
union all select 'A', '2009-10-01'
union all select 'A', '2009-11-01'
union all select 'A', '2009-12-01'
union all select 'C', '2010-01-01'
union all select 'D', '2010-01-02'
union all select 'D', '2010-01-03'
union all select 'D', '2010-01-04'
union all select 'E', '2010-01-05'
union all select 'E', '2010-01-06'
union all select 'D', '2010-01-07'
union all select 'D', '2010-01-08'
union all select 'E', '2010-01-09'
union all select 'E', '2010-01-10'
union all select 'D', '2011-01-01'
union all select 'D', '2011-01-02'
union all select 'E', '2012-01-01'
union all select 'X', '2012-01-02'
union all select 'D', '2012-01-03'
go
--Actual Solution
select *
, noDays + noDaysAtStatusAtStart noDaysAtStatusAtEnd
from
(
select id
, groupId
, startDate
, noDays
, case
when groupId = previousGroupId then lag(noDays,1) over (order by startDate)
--when previousGroupId is null then 0 --covered by else
else 0
end noDaysAtStatusAtStart
from
(
select id
, startDate
, groupId
, endDate
, previousGroupId
, dateDiff(day,startDate,endDate) noDays
from
(
select id
, startDate
, groupId
, lead(startDate,1) over (order by startDate) endDate
, lag(groupId,1) over (order by startDate) previousGroupId
from demo
) x
) y
) z
order by z.startDate
A組發生兩次以上,是嗎? – iruvar 2012-08-02 23:43:19
你使用了哪個數據庫? SQL 2012有一些時髦的功能可以幫助解決這個問題,但我猜測你已經不太可能使用該版本了? – JohnLBevan 2012-08-02 23:54:09
我在SQL 2008 R2上 – sri 2012-08-03 00:14:47