SQL中去除重復數據的幾種方法匯總(窗口函數對數據去重)
使用SQL對數據進行提取和分析時,我們經常會遇到數據重復的場景,需要我們對數據進行去重後分析。
以某電商公司的銷售報表為例,常見的去重方法我們用到distinct 或者group by 語句, 今天介紹一種新的方法,利用窗口函數對數據去重。
【字段解釋】
訪客id:進入店鋪瀏覽寶貝的客戶
瀏覽時間:訪客進入店鋪瀏覽頁面的日期
瀏覽時常:訪客進入店鋪瀏覽頁面的時長
現在需要知道店鋪裡每個訪客和對應的瀏覽日期(每個訪客同一天瀏覽多次算做一次記錄)
【解題思路】
方法1:distinct
SQL書寫如下:
select distinct 訪客id ,瀏覽時間 from 淘寶日銷售數據表;
查詢結果:
這裡用distinct語句多字段進行去重的時候,需要特別註意2點:
1)distinct語法規定對單字段、多字段去重,必須放在第一個查詢字段前。
2)如果對表中多列字段進行去重,去重的過程就是將多字段作為整體去重,比如上面的例子,我們將訪客id和瀏覽時間為整體去去重,而不是對訪客id單獨去重後再對姓名單獨去重,所以會出現相同的訪客id對應不同的瀏覽時間。
方法2:group by
SQL書寫如下:
select 訪客id ,瀏覽時間 from 淘寶日銷售數據表 group by 訪客id ,瀏覽時間;
查詢結果:
group by對訪客id 和瀏覽時間進行分組,分組匯總後改變瞭表的行數,一行隻有一個類別,這裡使用group by後會將訪客id 和瀏覽時間作為一個類別保留,重復的就會不顯示。
方法3:窗口函數
使用窗口函數進行去重時,比distinct和group by稍微復雜些,窗口函數不會減少原表中的行數,而是對字段進行分組後排序。詳細的窗口函數講解
窗口函數的基本語法如下:
<窗口函數> over (partition by <用於分組的列名> order by <用於排序的列名>)
根據題目要求得出每個訪客和對應的瀏覽日期,我們對訪客id ,瀏覽時間進行分組,對瀏覽時長(秒)進行排序。
SQL書寫如下:
select 訪客id ,瀏覽時間 ,row_number()over(partition by 訪客id ,瀏覽時間 order by 瀏覽時長(秒)) as 排名 from 淘寶日銷售數據表;
查詢結果:
窗口函數查詢按照每個客戶和瀏覽日期分組,如果同一天有幾次瀏覽,會根據點贊數排序,篩選排名為1,即可得出每個訪客和對應的瀏覽日期。
SQL書寫如下:
select 訪客id ,瀏覽時間 ,row_number()over(partition by 訪客id ,瀏覽時間 order by 瀏覽時長(秒)) as 排名 from 淘寶日銷售數據表;
查詢結果:
去除重復項的三種操作,你get瞭嗎?歡迎評論區補充你的去重辦法~
到此這篇關於SQL中去除重復數據的幾種方法,我一次性都告你的文章就介紹到這瞭,更多相關sql去除重復數據內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!