sql distinct多个字段_数据分析|记一“道”难忘的SQL面试题...
最近被一個簡單的SQL問題吊打,強顏歡笑
好了正文開始
一問:SQL中的 group by 和 distinct 了解嗎,簡單介紹一下?
了解了解,“Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”劃分成若干個“小區域”,然后針對若干個“小區域”進行數據處理。
distinct是一個關鍵字,常用于select之后,用于取出去重之后的值。
追問:可以可以,那你能描述一下它倆之間的關系嗎?
(之前一直沒注意過group by和distinct之間還有關系...)
其實仔細想想,group by是分組合并,既然分組就會“減少”一部分數據;distinct主要是去重操作,同樣也會減少一部分數據,既然都會減少一部分數據,這是不是就是他們的共通之處??
所以,group by 和 distinct 都可以用于去重。那有什么區別呢?
簡單創建一個測試表object,有兩個字段編號no和名字name,添加一些數據,如圖1所示,要求去重輸出,輸出結果為【1001 狗哥】和【1002 小盒】。
圖1分別測試如下SQL語句:
SELECT DISTINCT name FROM object ----------------------------------- SELECT DISTINCT name, no FROM object可以發現,當單獨對name字段去重后,輸出如下圖圖2所示:
圖2確實達到了對name字段去重的效果,可是要是使用 "SELECT DISTINCT name,no"語句,會發現輸出結果如圖3所示
圖3仔細對比圖一發現,只有兩個字段完全一樣的數據【1001 狗哥】被去掉,其他只有一個字段重復的數據并沒有變化。其實這就反映了一個事實:distinct主要是針對全部字段去重,即去掉完全一樣的數據。
要想每個字段只保留同一個值,即針對單字段去重,也就是題目中所要求的輸出【1001 狗哥】和【1002 小盒】,可以采用group by聚合去重,代碼如下:
SELECT no, name FROM object GROUP BY name輸出結果如圖4所示,達到最初目的:
圖4總結
distinct和group by都可以用來去重,不同之處是distinct針對全部字段去重,而group by可以針對全部字段中的單一字段去重。
此外,兩者執行方式不同,distinct主要是對數據兩兩進行比較,需要遍歷整個表。group by分組類似先建立索引再查索引,當數據量較大時,group by速度要優于distinct。
所以在實際應用中,經常會采用group by去重,比如計算獨立訪客數UV,獨立IP數和用戶留存率時,都需要對用戶id等信息去重,采用group by可以大幅縮短時間。
總結
以上是生活随笔為你收集整理的sql distinct多个字段_数据分析|记一“道”难忘的SQL面试题...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: volatile的应用
- 下一篇: docker mysql总是退出_doc
