全部產品
Search
文件中心

MaxCompute:COUNT函數

更新時間:Jan 01, 2026

COUNT函數用於計算記錄數。

適用範圍

  • 視窗函數只能出現在SELECT語句中。

  • 視窗函數中不能嵌套使用視窗函數和彙總函式。

  • 視窗函數不能和同層級的彙總函式一起使用。

命令格式

-- 計算記錄數
BIGINT COUNT([DISTINCT|ALL] <colname>)

-- 計算視窗中的記錄數
BIGINT COUNT(*) OVER ([partition_clause] [orderby_clause] [frame_clause])
BIGINT COUNT([DISTINCT] <expr>[,...]) OVER ([partition_clause] [orderby_clause] [frame_clause])

參數說明

  • DISTINCT|ALL:可選。表示在計數時是否去除重複記錄,預設為ALL,即計算全部記錄。如果指定DISTINCT,則只計算唯一值數量。

  • colname:必填。列值可以為任意類型。colname可以為*,即COUNT(*),此時返回所有行數。colname值為NULL時,該行不參與計算。

  • expr:必填。待計算計數值的列。可以為任意類型。當值為NULL時,該行不參與計算。當指定DISTINCT關鍵字時,表示取唯一值的計數值。

    COUNT([DISTINCT] <expr>[,...]):計算指定視窗記錄中所有值均不為NULL的行數。若指定DISTINCT關鍵字,則對這些行去重後計數。

  • partition_clauseorderby_clauseframe_clause:詳情請參見windowing_definition

傳回值說明

返回BIGINT類型。colname值為NULL時,該行不參與計算。

使用樣本

準備測試資料

如果已有資料,可忽略該步驟。

  1. 下載測試資料test_data.txt

  2. 建立測試表

    CREATE TABLE IF NOT EXISTS emp(
      empno BIGINT,
      ename STRING,
      job STRING,
      mgr BIGINT,
      hiredate DATETIME,
      sal BIGINT,
      comm BIGINT,
      deptno BIGINT
    );
  3. 載入資料

    根據資料檔案的實際path(路徑以及名稱)替換FILE_PATH

    TUNNEL UPLOAD FILE_PATH emp;   

樣本1:指定某一列為開窗列,返回不排序情況下累計計數值

指定薪水(sal)為開窗列,不排序,返回當前視窗(相同sal)的從開始行到最後一行的累計計數值。

  • 命令樣本

    SELECT sal, COUNT(sal) OVER (PARTITION BY sal) AS count FROM emp;
  • 返回結果

    +------------+------------+
    | sal        | count      | 
    +------------+------------+
    | 800        | 1          | 
    | 950        | 1          | 
    | 1100       | 1          | 
    | 1250       | 2          |  -- 視窗開始行。第1行和第2行的sal一致,則第1行的count為第2行的累計計數值。
    | 1250       | 2          |  -- 當前視窗從第1行到第2行的累計計數值。
    | 1300       | 2          | 
    | 1300       | 2          | 
    | 1500       | 1          | 
    | 1600       | 1          | 
    | 2450       | 2          | 
    | 2450       | 2          | 
    | 2850       | 1          | 
    | 2975       | 1          | 
    | 3000       | 2          | 
    | 3000       | 2          | 
    | 5000       | 2          | 
    | 5000       | 2          | 
    +------------+------------+

樣本2:非Hive相容模式下,指定某一列為開窗列,返回排序後累計計數值

非Hive相容模式下,指定薪水(sal)為開窗列,並排序,返回當前視窗(相同sal)從開始行到當前行的累計計數值。

  • 命令樣本

    -- 關閉Hive相容模式。
    SET odps.sql.hive.compatible=false;
    
    SELECT sal, COUNT(sal) OVER (PARTITION BY sal ORDER BY sal) AS count FROM emp;
  • 返回結果

    +------------+------------+
    | sal        | count      |
    +------------+------------+
    | 800        | 1          |
    | 950        | 1          |
    | 1100       | 1          |
    | 1250       | 1          |   -- 視窗開始行。第1行的累計計數值是1。
    | 1250       | 2          |   -- 第2行的累計計數值是2。
    | 1300       | 1          |
    | 1300       | 2          |
    | 1500       | 1          |
    | 1600       | 1          |
    | 2450       | 1          |
    | 2450       | 2          |
    | 2850       | 1          |
    | 2975       | 1          |
    | 3000       | 1          |
    | 3000       | 2          |
    | 5000       | 1          |
    | 5000       | 2          |
    +------------+------------+

樣本3:Hive相容模式下,指定某一列為開窗列,返回排序後累計計數值

Hive相容模式下,指定薪水(sal)為開窗列,並排序,返回當前視窗(相同sal)從開始行至最後一行的累計計數值。

  • 命令樣本

    -- 開啟Hive相容模式。
    SET odps.sql.hive.compatible=true;
    
    SELECT sal, COUNT(sal) OVER (PARTITION BY sal ORDER BY sal) AS count FROM emp; 
  • 返回結果

    +------------+------------+
    | sal        | count      |
    +------------+------------+
    | 800        | 1          |
    | 950        | 1          |
    | 1100       | 1          |
    | 1250       | 2          |   -- 視窗開始行。第1行和第2行的sal一致,則第1行的count為第2行的累計計數值。
    | 1250       | 2          |   -- 當前視窗從第1行到第2行的累計計數值。
    | 1300       | 2          |
    | 1300       | 2          |
    | 1500       | 1          |
    | 1600       | 1          |
    | 2450       | 2          |
    | 2450       | 2          |
    | 2850       | 1          |
    | 2975       | 1          |
    | 3000       | 2          |
    | 3000       | 2          |
    | 5000       | 2          |
    | 5000       | 2          |
    +------------+------------+

樣本4:返回總行數

計算所有部門的總職工人數。

  • 命令樣本

    SELECT COUNT(*) FROM emp;
  • 返回結果

    +------------+
    | _c0        |
    +------------+
    | 17         |
    +------------+

樣本5:分組計算各組總數

GROUP BY配合使用,對所有職工按照部門(deptno)分組,計算各部門(deptno)的職工人數。

  • 命令樣本

    SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
  • 返回結果

    +------------+------------+
    | deptno     | _c1        | 
    +------------+------------+
    | 20         | 5          | 
    | 30         | 6          | 
    | 10         | 6          | 
    +------------+------------+

樣本6:去重計數

通過DISTINCT去重,計算部門數量。

  • 命令樣本

    SELECT COUNT(DISTINCT deptno) FROM emp;
  • 返回結果

    +------------+
    | _c0        |
    +------------+
    | 3          |
    +------------+

相關函數

COUNT函數屬於彙總函式或視窗函數。

  • 更多將多條輸入記錄進行求平均值、參數彙總的相關函數請參見彙總函式

  • 更多對指定開窗列的資料進行求和、數值排序的相關函數請參見視窗函數