SQL - APPROX_COUNT_DISTINCT() 函数



SQL APPROX_COUNT_DISTINCT() 函数返回具有不同表达式值的近似行数。此函数提供 COUNT (DISTINCT 表达式) 函数的替代方案。此函数比 COUNT-DISTINCT 执行操作使用更少的内存。它是 SQL Server 2019 中引入的新函数之一。

APPROX_COUNT_DISTINCT() 函数主要用于大数据场景。此函数返回组中唯一非空值的个数。它通常用于具有超过一百万行的庞大数据集以及具有许多不同值的列的聚合。它专为响应速度比绝对清晰度更重要的场景而设计。此函数会忽略包含空值的那些行。

语法

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

APPROX_COUNT_DISTINCT( expression ) 

参数

  • **表达式** - 任何类型的表达式。此函数不接受图像、sql_variant 或文本。

示例

在下面的示例中,我们使用 APPROC_COUNT_DISTINCT() 函数从 customers 表中获取列“AGE”中值的近似个数。假设我们使用以下查询创建了一个名为 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);
INSERT INTO customers VALUES(8,'Aman', 23, 'Delhi', 3000.00);
INSERT INTO customers VALUES(9, 'Khilan', 25, 'Delhi', 3000.00);
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    | 5000.00 |
|  8 | Aman     |  22 | Delhi     | 3000.00 |
|  9 | Khilan   |  25 | Delhi     | 3000.00 |
+----+----------+-----+-----------+---------+

以下 SQL 查询显示客户 DISTINCT AGE 的近似计数:

SELECT APPROX_COUNT_DISTINCT(AGE) AS Approx_Distinct_AGE FROM customers;

输出

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

+--------------------+
|Approx_Distinct_AGE |
+--------------------+
|                  5 | 
+--------------------+

示例

在下面的示例中,在 customers 表上使用带有 GROUP BY 子句的 APPROX_COUNT_DISTINCT() 函数。它获取所有名称并计算不同的年龄值:

SELECT NAME, APPROX_COUNT_DISTINCT(AGE) AS Approx_Distinct_AGE FROM customers GROUP BY NAME;

输出

以下是上述 SQL 查询的输出。在 customers 表中,有多个名称具有相同的年龄,但 APPROX_COUNT_DISTINCT() 函数仅计算不同的值:

+---------+---------------------+
| NAME    | Approx_Distinct_AGE |
+---------+---------------------+
| Ramesh  |                   1 |
+---------+---------------------+
| Hardik  |                   1 |
+---------+---------------------+
| Aman    |                   1 |
+---------+---------------------+
| kaushik |                   1 |
+---------+---------------------+
| Chaitali|                   1 |
+---------+---------------------+
| Khilan  |                   1 |
+---------+---------------------+
| Komal   |                   1 |
+---------+---------------------+

示例

在下面的示例中,我们获取 ID 和 salary,并使用 APPROX_COUNT_DISTINCT() 函数来计算不同的 salary。显示 ID 和 salary 以及“group by”和“order by”子句。

以下 SQL 查询将从上述客户表中获取 ID、salary 和 salary 的计数:

SELECT ID, SALARY, APPROX_COUNT_DISTINCT(SALARY) AS Approx_Distinct_SALARY FROM customers GROUP BY ID, SALARY ORDER BY ID;

输出

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

+----+----------+------------------------+
| ID |   SALARY | Approx_Distinct_SALARY |
+----+----------+------------------------+
|  1 |  2000.00 |                     1  |
+----|----------+------------------------+
|  2 |  1500.00 |                     1  |
+----|----------+------------------------+
|  3 |  2000.00 |                     1  |
+----|----------+------------------------+
|  4 |  6500.00 |                     1  |
+----|----------+------------------------+
|  5 |  8500.00 |                     1  |
+----|----------+------------------------+
|  6 |  4500.00 |                     1  |
+----|----------+------------------------+
|  7 |  5000.00 |                     1  |
+----|----------+------------------------+
|  8 |  3000.00 |                     1  |
+----|----------+------------------------+
|  9 |  3000.00 |                     1  |
+----|----------+------------------------+
sql-aggregate-functions.htm
广告