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