(NetSuite)我正在进行交易搜索,如果过去十二个月的加仑数在合同合规性的特定范围内,则应用按比例计算的违约金。我们每周至少有100,000笔交易。
我已经保存了这个搜索功能,但我想让它更快、更优雅/更简单。
这是当前的工作解决方案:
CASE
WHEN (expr1 >= xx) THEN outcome1
WHEN (expr1 >= yy) THEN outcome2
etc .. etc
ELSE alt-outcome
END
“expr1”是包含“SUM”和“CASE WHEN”的实际公式。
如果当前解决方案必须经过“outcome4”,则 NetSuite 会超时,因为它必须分别计算“expr1”四次(或更多),并且这需要太长时间。
但是,如果我使用以下内容,那么 NetSuite 只需要计算“expr1”一次,因此不会超时且速度更快:
CASE (expr1)
WHEN (>= xx) THEN outcome1
WHEN (>= yy) THEN outcome2
etc .. etc
ELSE alt-outcome
END
但是,如果我使用 ">"、"<", ">=" 或 "<=" ... as in either (>= xx) 或 (>= yy) .. 等,它总是会失败
请问如何进行这项工作?
您可以尝试将 expr1 的结果放入子查询中,看看是否有帮助。如果是这样,请感到惊讶,优化器应该能够识别并合并冗余步骤,即使您最初是如何编写的。
select
case when expr1_result > xx then outcome1
when expr1_result > yy then outcome2
...
else alt_outcome
end as final_name
from (
select st.*,
expr1(<args>) as expr1_result
from some_table st
)