總結distinct、group by 、row_number()over函數用法及區別


    • distinct和group by 是一樣的,查詢去重,只能是全部重復的,也可以理解為針對單例,因為一行有一個字段不一樣,他們就會認為這兩行內容是不重復的。但是使用row_number()over這個函數就可以針對全部字段,完全重復還是部分重復都可以通過這個函數查找出來,因為它自身有分組的功能。以下就是具體代碼:

      • 06e9905b46944b763525d0c48b8f8cfe.png06e9905b46944b763525d0c48b8f8cfe.png
      • 上面那個表就是在最后兩行時候ID,NAME,BIRTHDAY三個字段值重復,AGE字段值不一樣。
      • SELECT DISTINCT ID,NAME,BIRTHDAY FROM B查詢結果就是:
      • 1aff0fb8a27c0842d36db613f000dcb9.png1aff0fb8a27c0842d36db613f000dcb9.png
      • 但是語句上加上AGE字段,SELECT DISTINCT ID,NAME,BIRTHDAY,AGE FROM B 結果就不一樣了:
      • cc083ab734916f8bb2425aea68f1c7ed.pngcc083ab734916f8bb2425aea68f1c7ed.png
      • 會發現DISTINCT函數沒有起作用,GROUP BY 函數和DISTINCT一樣的,只是使用GROUP BY函數時候這樣寫就不會錯:
        • SELECT ID,NAME,AGE,BIRTHDAY FROM B GROUP BY ID,NAME,AGE,BIRTHDAY;
      • 換一種寫法:SELECT ID,NAME,AGE,BIRTHDAY FROM B GROUP BY ID;就會報錯,意思就是SELECT后面的跟幾個字段,GROUP BY 后面也要跟幾個字段,要不然就會報錯。
    • 說一說ROW_NUMBER()OVER這個函數:

      • 刪除一張表中重復數據,當你不知道那一個字段重復,或者你知道那一個字段重復,還有就是根據你的業務需求在用這個函數時候,因為這個函數在一定比較上還是有點麻煩,能不用就不用,但是呢這個函數內部有一個分組排序功能,也算是一種優化,像DISTINCT,不能隨便用,成本高,效率低下,其實可以用group by 進行優化,其他的優化待續.......

      • ROW_NUMBER()OVER

        • DELETE FROM (SELECT ID,ROW_NUMBER()OVER(PARTITION BY ID ORDER BY NAME)ROW_NUM FROM B)WHERE ROW_NUM>1;--這是刪除表中全部重復部分重復的字段,根據業務需求。在你知道具體字段值重復時候直接delete from tablename where條件就可以刪除。
      • 使用ROW_NUMBER()OVER函數查詢時候去重怎么操作:

        • select * from (select id,name,age,birthday, row_number() over (partition by id order by id)rank from b)where rank =1;
      • 原來的表數據是這樣的:

      • ee48da82d2895528c1a88e46cfd4c5c6.pngee48da82d2895528c1a88e46cfd4c5c6.png

      • 執行上面代碼后結果是這樣的:

      • d8ca693c2a00ca7532251f81a5c60653.pngd8ca693c2a00ca7532251f81a5c60653.png

      • 使用row_number()over函數進行刪除部分或者全部重復數據的代碼是這樣的:

        • delete from (select id,name,age,birthday, row_number() over (partition by id order by id)rank from b)where rank >1;
      • 執行之前數據是這樣的:

      • 5bd0811d0b2dffcdb082392aee8fd443.png5bd0811d0b2dffcdb082392aee8fd443.png

      • 執行刪除代碼之后就是這樣的:

      • 193e3c3dfe0592ab8df2a67f1dccbbba.png193e3c3dfe0592ab8df2a67f1dccbbba.png
        * 會這一個基本就行了,刪除全部重復,部分重復,查詢全部重復,查詢部分重復均可用這一個。

      • 其實個人對這個函數理解是:在查詢時候,進行partition by 分組,order by 排序,然后把查詢出來的結果集取個別名,可以把它當成一張表進行條件查詢,別名rank就是分組之后那一列列名,新生的表包含rank這一個列,此時,就可以對這張分組排序好的表進行查詢,最后查出來的結果就是去重的,無論全部重復或者部分重復均可使用。刪除語句的道理和這個查詢一模一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM