34,590
社区成员
发帖
与我相关
我的任务
分享
--方法1 速度未知
;WITH CTE AS(
SELECT system_id,system_name,Status_Time1
,ROW_NUMBER()OVER(PARTITION BY system_id ORDER BY Status_Time1)RN
FROM System_History
WHERE System_Parent_ID=0 AND System_Status1>0
)
SELECT T1.system_id,T1.system_name,T1.Status_Time1,T2.Status_Time1
FROM CTE T1
LEFT JOIN CTE T2 ON T1.system_id=T2.system_id AND T1.RN=T2.RN+1
WHERE T1.Status_Time1>dateadd(day,-1,getdate())
--方法2 应该和子查询差不多
SELECT T1.system_id,T1.system_name,T1.Status_Time1,T3.Status_Time1
FROM System_History T1
OUTER APPLY(SELECT TOP 1 Status_Time1 FROM System_History T2
WHERE T1.system_id=T2.system_id AND T1.Status_Time1>T2.Status_Time1
ORDER BY T2.Status_Time1 DESC)T3
where T1.System_Parent_ID=0 and dateadd(day,-1,getdate())<T1.Status_Time1 and T1.System_Status1>0
--综合1和2的方法
;WITH CTE AS(
SELECT system_id,system_name,Status_Time1
,ROW_NUMBER()OVER(PARTITION BY system_id ORDER BY Status_Time1)RN
FROM System_History
WHERE System_Parent_ID=0 AND Status_Time1>dateadd(day,-1,getdate()) AND System_Status1>0
)
SELECT T1.system_id,T1.system_name,T1.Status_Time1,ISNULL(T2.Status_Time1,T4.Status_Time1)
FROM CTE T1
LEFT JOIN CTE T2 ON T1.system_id=T2.system_id AND T1.RN=T2.RN+1
OUTER APPLY(SELECT TOP 1 Status_Time1 FROM System_History T3
WHERE T2.system_id IS NULL AND T1.system_id=T3.system_id AND T1.Status_Time1>T3.Status_Time1
ORDER BY T3.Status_Time1 DESC)T4
SELECT *
FROM (
select system_id,system_name,Status_Time1
from System_History sh
where System_Parent_ID=0
and dateadd(day,-1,getdate())<Status_Time1
and sh.System_Status1>0
) t1
OUTER APPLY (
Select TOP 1 Status_time1 AS Status_time0
From System_History
Where system_id = sh.System_ID
And Status_time1 < sh.Status_Time1
ORDER BY Status_time1 DESC
) t2
order by Status_Time1,System_ID