所以我需要一个表来计算一些数据,如下所示:
id count CreateDate completeddate
1 4000 2014-02-05 00:41:13.943 2014-02-05 00:41:14.293
1 1490 2014-02-05 00:41:49.880 2014-02-05 01:36:03.547
1 10 2014-02-05 00:48:42.350 2014-02-05 00:48:42.530
1 50000 2014-02-05 00:56:00.217 2014-02-05 00:56:00.347
我正在运行此查询:
with edc (id, count, createdate, completeddate)
as
(select id, count, CreateDate, completeddate from edch with (nolock) where id = 1)
select
(cast(sum(count) as float) / sum(cast((completeddate - createdate) as float) * 24)) as [Estimated Max Throughput],
sum(cast((completeddate - createdate) as float) * 24) as [Total Hours],
convert(date, createdate) as [Day]
from edc
where createdate > '2014-09-01 00:00:00.000'
and completeddate is not null
and (count > 500 or DATEDIFF(MM, createdate, completeddate) > 1)
group by convert(date, createdate)
order by [Day] desc
go
此查询基本上在特定日期范围的表中运行,汇总总计,然后计算系统未达到最大值(即仅运行20分钟)时的每小时理论最大值或运行时的实际最大值对于> 1小时。它的工作正常,我的输出是预期的,除了我有一个相隔超过1天的CreateDate和CompletedDate的情况。这些值是正常的,并且在数据集中是预期的,因此我需要找到一些方法来标准化它们。
我认为一个好的解决方案是
sum(cast((completeddate - actiondate) as float) * 24)
在24处切断(即,如果它返回80,则使用24代替)。问题是我无法弄清楚如何做到这一点。我尝试搜索,但是Floor()和Ceiling()没有做我需要的东西,我尝试搜索的大多数关键字返回的结果是从列中查找最大和最小音量。
我确信有一个简单的命令我可以使用我只是无法找到它。
这都是t-sql btw,我无法在应用层进行任何处理,因为没有:)
答案 0 :(得分:1)
我最后只是使用了一个case语句,我不喜欢它,因为它可以理解代码执行起来相当困难,但它的工作原理与我需要的完全相同,当异常值存在时结果更准确:
select
(cast(sum(count) as float) /
(CASE
WHEN sum(cast((completeddate - createdate) as float) * 24) > 24 THEN cast(24 as float)
ELSE sum(cast((completeddate - createdate) as float) * 24)
END)) as [Estimated Max Throughput]
如果其他人想出更好/更酷/更好/更快的解决方案,我会将其更新为正确答案。
答案 1 :(得分:0)
你可以尝试使用if,if(总和(cast((completeddate - actiondate)as float)* 24)> 24,24,sum(cast((completeddate - actiondate)as float)* 24))