SQL 쿼리의 스플릿 범위를 합산합니다
-
05-07-2019 - |
문제
서버 상태가 포함 된 테이블이 있습니다
create table ServerStatus
(
ServerId int,
StartTime datetime,
Seconds int,
[State] char(8)
)
시작 및 종료 날짜가 주어지면 서버가 해당 시간 동안 각 주에서 보내는 시간을 요약 할 수있는 쿼리를 원합니다. 또한 쿼리가 서버가 알려지지 않은 상태에서 소비하는 시간을 반환하기를 원합니다.
예를 들어 다음 데이터의 경우입니다
1 2008-01-01 00:00:00.000 120 broken
1 2008-01-02 00:00:00.000 120 off
1 2008-01-03 00:00:00.000 240 burning
1 2008-01-04 00:00:00.000 60 off
1 2008-01-05 00:00:00.000 60 off
2 2008-01-01 00:00:00.000 60 broken
2 2008-01-02 00:00:00.000 30 off
2 2008-01-03 00:00:00.000 20 burning
2 2008-01-04 00:00:00.000 600 off
3 2007-01-04 00:00:00.000 600 off
4 2007-12-12 00:00:00.000 999999999 onfire
범위를 제공했습니다.
select @start = dateadd(second, 60, '2008-01-01'),
@fin = dateadd(second, 60, '2008-01-04')
결과를 반환하고 싶습니다.
1 broken 60
1 burning 240
1 off 180
1 unknown 258720
2 burning 20
2 off 90
2 unknown 259090
4 onfire 259200
이 질문은 다음과 다소 관련이 있습니다. SQL 쿼리의 분할 날짜 범위를 결합합니다
해결책
이것은 내가 지금까지 내가 생각한 최고입니다.
declare @start datetime
declare @fin datetime
select @start = dateadd(second, 60, '2008-01-01'), @fin = dateadd(second, 60, '2008-01-04')
select ServerId, State, Total = sum(
case when StartTime > @start and DateAdd(second, Seconds, StartTime) <= @fin
then Seconds
when StartTime < @start and DateAdd(second, Seconds, StartTime) <= @fin
then DateDiff(second, @start, DateAdd(second, Seconds, StartTime))
when StartTime < @start and DateAdd(second, Seconds, StartTime) >= @fin
then DateDiff(second, @start, @fin)
else
DateDiff(second,StartTime,@fin)
end)
into #t
from ServerStatus
where @start < dateadd(second, Seconds, StartTime)
and @fin > StartTime
group by ServerId, State
insert #t
select ServerId, 'unknown', DateDiff(second, @start, @fin) - sum(Total)
from #t
group by ServerId
having DateDiff(second, @start, @fin) > sum(Total)
select * from #t
order by ServerId, State
제휴하지 않습니다 StackOverflow