至少SQL Server,HQL,Oracle都有效
通常SQL中對表中數據去重,會首先想到 distinct
關鍵字,
能實現的需求
1. distinct可以對單個字段去重
select distinct name from A
2. 對多個字段去重時,此時所列的字段需要同時滿足才會起到去重效果,否則不會去重
select distinct name, id from A --name和id同時重復才能去重,有一個不一樣都不會去重
--上面的寫法是對name和id列都去重,而不是僅對name去重,id不去重
select distinct * from A --*所代表的所有字段都重復時,才能去重
不能實現的需求
3. 不能實現指定字段去重,其他字段不去重的效果
select name, distinct id from A --僅希望對id列進行去重,name列不去重,xxx這樣是不行的,無法實現 ,而且會提示錯誤,因為distinct必須放在開頭
問題:
如果想實現針對某一字段去重,其他字段是否重復不關心的效果怎么處理?
答:
可以采用row_number()的窗口函數
轉換問題,可以轉換為對重復的行取top1,這樣使用over()函數,對指定列分組,排序,然后結合row_number()給每一組的數據一列序列,再對集合取序列為1的行
結合一些用例更容易懂一些。