SQL去重方法匯總
在使用SQL提數(shù)的時候,常會遇到表內(nèi)有重復(fù)值的時候,比如我們想得到 uv (獨立訪客),就需要做去重。
在 MySQL 中通常是使用 distinct
或 group by
子句,但在支持窗口函數(shù)的 sql(如Hive
SQL
、Oracle
等等) 中還可以使用 row_number 窗口函數(shù)進(jìn)行去重。
舉個栗子,現(xiàn)有這樣一張表 task:
備注:
task_id
: 任務(wù)id;order_id
: 訂單id;start_time
: 開始時間
注意:一個任務(wù)對應(yīng)多條訂單
我們需要求出任務(wù)的總數(shù)量,因為 task_id 并非唯一的,所以需要去重:
distinct
-- 列出 task_id 的所有唯一值(去重后的記錄) select distinct task_id from Task; -- 任務(wù)總數(shù) select count(distinct task_id) task_num from Task;
distinct
通常效率較低。它不適合用來展示去重后具體的值,一般與 count
配合用來計算條數(shù)。distinct
使用中,放在 select
后邊,對后面所有的字段的值統(tǒng)一進(jìn)行去重。比如distinct
后面有兩個字段,那么 1,1 和 1,2 這兩條記錄不是重復(fù)值 。
group by
-- 列出 task_id 的所有唯一值(去重后的記錄,null也是值) -- select task_id -- from Task -- group by task_id; -- 任務(wù)總數(shù) select count(task_id) task_num from (select task_id ? ? ? from Task ? ? ? group by task_id) tmp;
row_number
row_number 是窗口函數(shù),語法如下:
row_number() over (partition by <用于分組的字段名> order by <用于組內(nèi)排序的字段名>)
其中partition by
部分可省略。
-- 在支持窗口函數(shù)的 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;
此外,再借助一個表 test 來理理 distinct 和 group by 在去重中的使用:
-- 下方的分號;用來分隔行 select distinct user_id from Test; ? ?-- 返回 1; 2 select distinct user_id, user_type from Test; ? ?-- 返回1, 1; 1, 2; 2, 1 select user_id from Test group by user_id; ? ?-- 返回1; ?2 select user_id, user_type from Test group by user_id, user_type; ? ?-- 返回1, 1; 1, 2; 2, 1 select user_id, user_type from Test group by user_id; ? ? -- Hive、Oracle等會報錯,mysql可以這樣寫。 -- 返回1, 1 或 1, 2 ; 2, 1(共兩行)。只會對group by后面的字段去重,就是說最后返回的記錄數(shù)等于上一段sql的記錄數(shù),即2條 -- 沒有放在group by 后面但是在select中放了的字段,只會返回一條記錄(好像通常是第一條,應(yīng)該是沒有規(guī)律的)
到此這篇關(guān)于SQL去重方法匯總的文章就介紹到這了,更多相關(guān)SQL去重方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Linux安裝mysql 在/etc下沒有my.cnf的問題
這篇文章主要介紹了解決Linux安裝mysql 在/etc下沒有my.cnf的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01mysql密碼忘記后如何修改密碼(2022年最新版詳細(xì)教程保姆級)
因為長時間不操作mysql而忘記root密碼的朋友估計不在少數(shù),下面這篇文章主要給大家介紹了關(guān)于mysql密碼忘記后如何修改密碼的相關(guān)資料,本教程是2022年最新版詳細(xì)教程保姆級,需要的朋友可以參考下2022-04-04mysql8.0.30安裝配置最詳細(xì)教程(windows?64位)
這篇文章主要給大家介紹了關(guān)于windows?64位下mysql8.0.30安裝配置的相關(guān)資料,主要以圖片的形式展示安裝教程x,簡單易懂,小白專屬,需要的朋友可以參考下2022-09-09CentOS 7 安裝Percona Server+Mysql
這篇文章主要介紹了CentOS 7 安裝Percona Server+Mysql的相關(guān)資料,需要的朋友可以參考下2018-11-11Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)
這篇文章主要介紹了Mysql GROUP BY查詢每組某值最大的一條數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Mysql查看最大連接數(shù)和修改最大連接數(shù)的講解
今天小編就為大家分享一篇關(guān)于Mysql查看最大連接數(shù)和修改最大連接數(shù)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03