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
廣告