First of all, good job with the data and the DDL, made this easy;-)
Here is a quick window function solution, self explanatory and should get you passed this hurdle
😎
USE tempdb;
GO
SET NOCOUNT ON;
IF OBJECT_ID(N'dbo.ABC') IS NOT NULL DROP TABLE dbo.ABC;
CREATE TABLE [dbo].[ABC](
[Hno] [nchar](10) NULL,
[Status] [smallint] NULL,
[Date] [datetime] NULL
) ON [PRIMARY];
Insert into [dbo].[ABC] values (100,0,getdate()-6)
Insert into [dbo].[ABC] values (100,0,getdate()-5)
Insert into [dbo].[ABC] values (100,1,getdate()-4)
Insert into [dbo].[ABC] values (100,1,getdate()-3)
Insert into [dbo].[ABC] values (100,0,getdate()-2)
Insert into [dbo].[ABC] values (100,0,getdate()-1)
Insert into [dbo].[ABC] values (100,1,getdate())
;
;WITH STATUS_MARKED AS
(
SELECT
A.Hno
,A.[Status]
,CASE
WHEN LAG(A.[Status],1,A.[Status]) OVER
(
PARTITION BY (SELECT NULL)
ORDER BY A.[Date]
) = A.[Status] THEN 0
ELSE 1
END AS ST_FLG
,A.[Date]
FROM dbo.ABC A
)
,STATUS_SET AS
(
SELECT
SM.Hno
,SM.[Status]
,SM.[Date]
,SUM(SM.ST_FLG) OVER
(
PARTITION BY (SELECT NULL)
ORDER BY SM.[Date]
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
) AS ST_FLG
FROM STATUS_MARKED SM
)
,FINAL_SET AS
(
SELECT
ST.Hno
,ST.[Status]
,ST.[Date]
,ROW_NUMBER() OVER
(
PARTITION BY ST.ST_FLG
ORDER BY ST.[Date]
) AS ST_RID
FROM STATUS_SET ST
)
SELECT
FS.Hno
,FS.[Status]
,FS.[Date]
FROM FINAL_SET FS
WHERE FS.ST_RID = 1
;
Results
Hno Status Date
---------- ------ -----------------------
100 0 2014-12-19 21:55:44.333
100 1 2014-12-21 21:55:44.333
100 0 2014-12-23 21:55:44.333
100 1 2014-12-25 21:55:44.337