几年前我在一家电信公司工作,我不得不根据以下算法生成一个计算呼叫持续时间的公式:
如果RCT小于t1,则如果RCT大于t1则CD等于t1
,则CD = t1 + x*t2,其中x将"舍入"RCT到t2的下一个最高倍数.
该算法转换为:"第一个t1秒充电,然后每隔t2秒充电".
例:
t1 t2 RCT CD
60 10 48 60
60 10 65 70
60 10 121 130
30 20 25 30
30 20 35 50
30 20 65 70
Run Code Online (Sandbox Code Playgroud)
你能创建一个能够返回"呼叫持续时间"CD的函数/ SQL吗?
不使用if then else ......?
编辑:进一步简化,并修复了 < vs <= 错误。
没有浮点,适用于我有权访问的每个数据库:
create table calls (t1 int, t2 int, rct int, cd int)
insert into calls (t1, t2, rct, cd)
values (60, 10, 48, 60)
insert into calls (t1, t2, rct, cd)
values (60, 10, 65, 70)
insert into calls (t1, t2, rct, cd)
values (60, 10, 121, 130)
insert into calls (t1, t2, rct, cd)
values (30, 20, 25, 30)
insert into calls (t1, t2, rct, cd)
values (30, 20, 35, 50)
insert into calls (t1, t2, rct, cd)
values (30, 20, 65, 70)
--Additional test to show that it works
insert into calls (t1, t2, rct, cd)
values (60, 10, 70, 70)
select t1, t2, rct, cd,
t1 + case when rct <= t1
then 0
else ( (rct-1-t1) / t2 + 1) * t2 end as CalceCD
from calls
Run Code Online (Sandbox Code Playgroud)
结果:
t1 t2 rct cd CalceCD ----------- ----------- ----------- ----------- ------ ----- 60 10 48 60 60 60 10 65 70 70 60 10 121 130 130 30 20 25 30 30 30 20 35 50 50 30 20 65 70 70 60 10 70 70 70 (受影响的 6 行)
您可以自由地将函数创建为 UDF 或任何您的 SQL 环境允许清理选择的函数。
编辑:是的,下限和偏移量一可以避免浮动数学。