-
distinct和group by 是一樣的,查詢去重,只能是全部重復的,也可以理解為針對單例,因為一行有一個字段不一樣,他們就會認為這兩行內容是不重復的。但是使用row_number()over這個函數就可以針對全部字段,完全重復還是部分重復都可以通過這個函數查找出來,因為它自身有分組的功能。以下就是具體代碼:
- 上面那個表就是在最后兩行時候ID,NAME,BIRTHDAY三個字段值重復,AGE字段值不一樣。
- SELECT DISTINCT ID,NAME,BIRTHDAY FROM B查詢結果就是:
- 但是語句上加上AGE字段,SELECT DISTINCT ID,NAME,BIRTHDAY,AGE FROM B 結果就不一樣了:
- 會發現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;
-
原來的表數據是這樣的:
-
-
執行上面代碼后結果是這樣的:
-
-
使用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;
-
執行之前數據是這樣的:
-
-
執行刪除代碼之后就是這樣的:
-
* 會這一個基本就行了,刪除全部重復,部分重復,查詢全部重復,查詢部分重復均可用這一個。 -
其實個人對這個函數理解是:在查詢時候,進行partition by 分組,order by 排序,然后把查詢出來的結果集取個別名,可以把它當成一張表進行條件查詢,別名rank就是分組之后那一列列名,新生的表包含rank這一個列,此時,就可以對這張分組排序好的表進行查詢,最后查出來的結果就是去重的,無論全部重復或者部分重復均可使用。刪除語句的道理和這個查詢一模一樣。
-