在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函數的 sql(如Hive SQL、Oracle等等) 中還可以使用 row_number 窗口函數進行去重。
舉個栗子,現有這樣一張表 task:

備注:
task_id: 任務id;order_id: 訂單id;start_time: 開始時間
注意:一個任務對應多條訂單
我們需要求出任務的總數量,因為 task_id 並非唯一的,所以需要去重:
distinct
-- 列出 task_id 的所有唯一值(去重后的記錄) -- select distinct task_id -- from Task; -- 任務總數 select count(distinct task_id) task_num from Task;
distinct 通常效率較低。它不適合用來展示去重后具體的值,一般與 count 配合用來計算條數。
distinct 使用中,放在 select 后邊,對后面所有的字段的值統一進行去重。比如distinct后面有兩個字段,那么 1,1 和 1,2 這兩條記錄不是重復值 。
group by
-- 列出 task_id 的所有唯一值(去重后的記錄,null也是值) -- select task_id -- from Task -- group by task_id; -- 任務總數 select count(task_id) task_num from (select task_id from Task group by task_id) tmp;
row_number
row_number 是窗口函數,語法如下:row_number() over (partition by <用於分組的字段名> order by <用於組內排序的字段名>)其中 partition by 部分可省略。
-- 在支持窗口函數的 sql 中使用 select count(case when rn=1 then task_id else null end) task_num from (select task_id , row_number() over (partition by task_id order by start_time) rn from Task) tmp;

