如何将计算值限制为特定上限

时间:2014-09-16 20:27:36

标签: sql sql-server-2008

所以我需要一个表来计算一些数据,如下所示:

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,我无法在应用层进行任何处理,因为没有:)

2 个答案:

答案 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))