2017-07-18 111 views
-1

使用SQL Server 2008 R2。每小时24小时摘要百分比

我试图得到每小时分解24小时的时间百分比。

如果列AlertID是1,那么系统启动。如果AlertID是任何其他数字,那么它被视为关闭。

这是我目前没有工作,并有一个糟糕的性能结果,但让我们只是让它工作第一。正常运行时间列始终为0。

SELECT a.dayhour, 
     ((SELECT Count(*) 
      FROM commandhistory 
      WHERE commandid = '4263745C-5603-4E3D-AFB2-CA0E27969D0B' 
       AND alertid = 1 
       AND Datepart(hour, recordeddttm) = a.dayhour * 100)/(SELECT 
     Count(*) FROM commandhistory 
     WHERE commandid = '4263745C-5603-4E3D-AFB2-CA0E27969D0B' 
      AND Datepart(hour, recordeddttm) = a.dayhour)) AS UpTime 
FROM (SELECT 0 AS DayHour UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23) a 
     LEFT JOIN commandhistory h 
       ON a.dayhour = Datepart(hour, recordeddttm) 
GROUP BY a.dayhour 
ORDER BY a.dayhour 

示例表:(有其他数据,但我不关心它此实例)

uniqueidentifier CommandID 
smallint   AlertID 
datetime   RecordedDTTM 

AlertID可以是1-5。 1表示已启动,其他任何数字都应被视为关闭。

+0

不知道为什么有人检举这个封闭。我错过了什么? – Tsukasa

+1

这是一个投票dba.stackexchange.com,所以不是真正的密切投票。性能调优专家居住在那里,所以这样做是有道理的。 –

+0

架构和示例数据将使这个问题更容易解决。 – Jacobm001

回答

1

这个怎么样:

;with cte as 
(
SELECT Datepart(hour, recordeddttm) as DayHour 
    , sum(case when alertID=1 then 1 else 0 end) as UpTimeCt 
    , sum(case when alertID <> 1 then 1 else 0 end) as DownTimeCt 
    , Count(*) AllCt 
FROM commandhistory 
WHERE commandid = '4263745C-5603-4E3D-AFB2-CA0E27969D0B' 
--AND cast(recordeddttm as date) = [some date] --This is optional but limits data set 
group by Datepart(hour, recordeddttm) 
) 

select DayHour 
    , UpTimeCt 
    , UpTimeRate = UpTimeCt/AllCt --AllCt might need to be cast 
    , DownTimeCt 
    , DownTimeRate = DownTimeCt/AllCt --AllCt might need to be cast 
from cte 
+0

完美,一切都错了。 – Tsukasa