SQL - CHECKSUM_AGG() 函数



校验和返回一个值,该值指示输入值是否随时间推移而发生变化。校验和有助于我们识别自上次操作以来值是否已更改。此外,SQL 包含一个名为 CHECKSUM AGG 的函数,可用于验证单个值或一组值。

SQL 的CHECKSUM_AGG() 函数返回给定表达式指定的列的校验和值。它将所有列值加总并计算校验和。如果某一行或多行随时间推移而更改,则校验和将相应更改,指示列中的值已更改。CHECKSUM_AGG() 函数会忽略 NULL 值。我们可以将 OVER 子句与该函数一起使用。此函数仅用于数值列。

此函数还允许使用两个可选修饰符 ALL 和 DISTINCT。如果我们使用 ALL,则此函数计算所有值的聚合。如果我们使用 DISTINCT,则此函数返回唯一且非 NULL 值的数量。

语法

以下是SQL CHECKSUM_AGG() 函数的语法:

CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )

参数

  • expression - 整数表达式。checksum_agg() 不允许使用聚合函数或子查询。

示例

在以下示例中,我们使用 SQL CHECKSUM_AGG() 函数来检测 customers 表中 AGE 列的变化。

使用 CREATE 语句,我们创建了一个名为 customers 的表:

CREATE TABLE customers(ID INT NOT NULL, 
NAME VARCHAR(30) NOT NULL, 
AGE INT NOT NULL, 
ADDRESS CHAR(30), 
SALARY DECIMAL(18, 2));

该表存储 ID、NAME、AGE、ADDRESS 和 SALARY。现在,我们使用 INSERT 语句在 customers 表中插入 7 条记录。

INSERT INTO customers VALUES(1, 'Ramesh', 32, 'Ahmedabad', 2000.00);
INSERT INTO customers VALUES(2, 'Khilan', 25, 'Delhi', 1500.00);
INSERT INTO customers VALUES(3, 'kaushik', 23, 'Kota', 2000.00);
INSERT INTO customers VALUES(4, 'Chaitali', 25, 'Mumbai', 6500.00);
INSERT INTO customers VALUES(5, 'Hardik', 27, 'Bhopal', 8500.00);
INSERT INTO customers VALUES(6, 'Komal', 22, 'MP', 4500.00);
INSERT INTO customers VALUES(7, 'Aman', 23, 'Ranchi', null);

以下 SQL 查询显示 customers 表:

SELECT * FROM customers;
以下是 customers 表:
+----+----------+-----+-----------+---------+
| ID | NAME     | AGE | ADDRESS   | SALARY  |
+----+----------+-----+-----------+---------+
|  1 | Ramesh   |  32 | Ahmedabad | 2000.00 |
|  2 | Khilan   |  25 | Delhi     | 1500.00 |
|  3 | kaushik  |  23 | Kota      | 2000.00 |
|  4 | Chaitali |  25 | Mumbai    | 6500.00 |
|  5 | Hardik   |  27 | Bhopal    | 8500.00 |
|  6 | Komal    |  22 | MP        | 4500.00 |
|  7 | Aman     |  23 | Ranchi    |    NULL |
+----+----------+-----+-----------+---------+

以下 SQL 查询显示更新 AGE 列前后的原始校验和值和更新后的校验和值:

-- get the checksum value before the column value changed.
SELECT CHECKSUM_AGG(AGE) AS original_checksum from customers;
UPDATE customers SET AGE = 30 WHERE NAME = 'Aman';
--get the checksum of the modified column.
SELECT CHECKSUM_AGG(AGE) AS original_checksum from customers;

输出

以下是上述 SQL 查询的输出:

+--------------------+
|  original_checksum |
+--------------------+
|                 32 | 
+--------------------+

+--------------------+
|  original_checksum |
+--------------------+
|                 36 | 
+--------------------+

示例

在以下示例中,通过将 DISTINCT 作为参数之一传递,在不同的整数值上调用 checksum_agg() 函数。

-- get the checksum of all value.
SELECT CHECKSUM_AGG(AGE) AS original_checksum from customers;
--get the checksum of distinct value.
SELECT CHECKSUM_AGG(DISTINCT AGE) AS original_checksum from customers;

输出

以下是上述 SQL 查询的输出:

+--------------------+
|  original_checksum |
+--------------------+
|                 36 | 
+--------------------+

+--------------------+
|  original_checksum |
+--------------------+
|                 61 | 
+--------------------+

示例

在以下示例中,我们使用 SQL CHECKSUM_AGG() 函数来检测 customers 表中 SALARY 列的变化。CHECKSUM_AGG() 函数始终接受整数类型的列。由于 salary 列包含 decimal 数据类型,因此我们必须将其转换为 INT。

以下 SQL 查询显示 SALARY 的原始和修改后的校验和:

--original checksum
SELECT CHECKSUM_AGG(CAST(SALARY AS INT)) AS original_SALARY from customers;
UPDATE customers SET SALARY = 5000 WHERE NAME = 'Aman';
--checksum after modified
SELECT CHECKSUM_AGG(CAST(SALARY AS INT)) AS original_SALARY from customers;

输出

以下是上述 SQL 查询的输出:

+------------------+
|  original_SALARY |
+------------------+
|            11288 | 
+------------------+

+------------------+
|  original_SALARY |
+------------------+
|            16272 | 
+------------------+
sql-aggregate-functions.htm
广告