跳到主要内容
跳到主要内容

sumWithOverflow

计算一组数字的总和,结果的数据类型与输入参数相同。如果总和超过该数据类型的最大可表示值,则会发生溢出,并按该类型的溢出语义进行计算。

仅适用于数值类型。

语法

sumWithOverflow(num)

参数

返回值

示例

首先,我们创建一个表 employees 并向其中插入一些虚构的员工数据。对于本示例,我们将 salary 设为 UInt16,这样在对这些值求和时可能会发生溢出。

查询:

CREATE TABLE employees
(
    `id` UInt32,
    `name` String,
    `monthly_salary` UInt16
)
ENGINE = Log
SELECT
    sum(monthly_salary) AS no_overflow,
    sumWithOverflow(monthly_salary) AS overflow,
    toTypeName(no_overflow),
    toTypeName(overflow)
FROM employees

我们使用 sumsumWithOverflow 函数查询员工工资总额,并使用 toTypeName 函数显示它们的类型。 对于 sum 函数,结果类型为 UInt64,足够大,可以容纳该总和;而对于 sumWithOverflow,结果类型则保持为 UInt16

查询:

SELECT 
    sum(monthly_salary) AS no_overflow,
    sumWithOverflow(monthly_salary) AS overflow,
    toTypeName(no_overflow),
    toTypeName(overflow),    
FROM employees;

结果:

   ┌─no_overflow─┬─overflow─┬─toTypeName(no_overflow)─┬─toTypeName(overflow)─┐
1. │      118700 │    53164 │ UInt64                  │ UInt16               │
   └─────────────┴──────────┴─────────────────────────┴──────────────────────┘