SQL APPROX_COUNT_DISTINCT() 函数
SQL的APPROX_COUNT_DISTINCT()函数返回具有不同表达式值的行的近似数量。该函数提供了COUNT(DISTINCT expression)函数的替代方法。该函数使用的内存较少,操作更高效。这是SQL Server 2019引入的新函数之一。
APPROX_COUNT_DISTINCT()函数主要用于大数据场景。该函数返回一个组中唯一非空值的数量。它通常用于具有超过一百万行和许多不同值的列的大型数据集的聚合。它专为优先响应性而不是绝对清晰度的情况而设计。该函数忽略包含空值的行。
语法
以下是 SQL APPROX_COUNT_DISTINCT() 函数的语法−
APPROX_COUNT_DISTINCT( expression )
参数
- 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);
+----+----------+-----+-----------+---------+
| 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查询显示客户的不同年龄近似数量:
SELECT APPROX_COUNT_DISTINCT(AGE) AS Approx_Distinct_AGE FROM customers;
输出
下面是上述SQL查询的输出结果 –
+--------------------+
|Approx_Distinct_AGE |
+--------------------+
| 5 |
+--------------------+
示例
在下面的示例中,使用APPROX_COUNT_DISTINCT()函数和GROUP BY子句在customers表上。它获取所有的名称并计算不同年龄值的数量 –
SELECT NAME, APPROX_COUNT_DISTINCT(AGE) AS Approx_Distinct_AGE FROM customers GROUP BY NAME;
输出
以下是上述SQL查询的输出结果。在客户表中,存在多个年龄相同的姓名,但是APPROX_COUNT_DISTINCT()函数只计算不同值的个数−
+---------+---------------------+
| NAME | Approx_Distinct_AGE |
+---------+---------------------+
| Ramesh | 1 |
+---------+---------------------+
| Hardik | 1 |
+---------+---------------------+
| Aman | 1 |
+---------+---------------------+
| kaushik | 1 |
+---------+---------------------+
| Chaitali| 1 |
+---------+---------------------+
| Khilan | 1 |
+---------+---------------------+
| Komal | 1 |
+---------+---------------------+
示例
在下面的示例中,我们获取ID和薪水,并使用APPROX_COUNT_DISTINCT()函数来计算不重复的薪水数量。显示ID和薪水,还包括”group by”和”order by”子句。
下面的SQL查询将从上面的客户表中获取ID,薪水和薪水数量。
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 |
+----|----------+------------------------+