最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL數(shù)據(jù)去重的七種方法小結

 更新時間:2024年03月15日 10:56:06   作者:小_強  
在平時工作中,使用SQL語句進行數(shù)據(jù)去重的場景非常多,本文主要介紹了SQL數(shù)據(jù)去重的七種方法小結,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧

在平時工作中,使用SQL語句進行數(shù)據(jù)去重的場景非常多。

今天主要分享幾種數(shù)據(jù)去重的SQL寫法。

假如有一張student表,結構如下:

create table student(
    id int,
    name varchar(50),
    age int,
    address varchar(100)
);

表中的數(shù)據(jù)如下:

圖片

方法一:使用DISTINCT關鍵字進行去重

在使用DISTINCT關鍵字去重時,后面跟上去重的字段即可。

比如,取出student表中,不重復的address有哪些,可以使用如下SQL語句:

select distinct address 
from student;

返回結果如下:

圖片

這種方法,最大的優(yōu)點是使用起來比較簡單。

但也有一個比較大的缺點,就是最終返回的結果集中的字段最多只包含去重的字段。也就是說,在上面的SQL語句中,使用address字段進行去重,最終的結果,也最多只能返回address一個字段。

如果想以address字段去重,并且同時返回其他字段,DISTINCT是做不到的。

方法二:使用GROUP BY關鍵字進行去重

與DISTINCT關鍵字一樣,GROUP BY關鍵字,也是標準SQL支持的常用的去重方法。它可以在去重的同時,同步返回其他字段的信息。

還是以對address字段進行去重為例,其他字段可以使用聚合函數(shù)根據(jù)需要進行獲?。?/p>

select min(id),
    max(name),
    max(age),
    address
from student 
group by address;

返回結果如下:

圖片

在上面的語句中,不僅對address字段進行了去重,也同時返回了id、name、age字段的信息。

在這一點上,比DISTINCT要好用很多。

不過,仔細一看,好像總是覺得哪里不對勁。

id=1的學生,應該叫周俊廷,而在上面的返回結果中卻是楊蕭語,返回的age字段,也有同樣的問題。

也就是說,在返回的結果中,同一行的id、name、age,可能并不是同一個學生的,這就導致看起來數(shù)據(jù)有些混亂。

如果對數(shù)據(jù)的一致性有要求,可以使用下面的第三種方法。

方法三:使用窗口函數(shù)進行去重

窗口函數(shù)有好幾種,使用起來大同小異,這里只介紹ROW_NUMBER() over(partition by ... order by ...)。

select
    id,name,age,address
from (
    select id,name,age,address,
        row_number() over(
            partition by address 
            order by id asc
        ) as rn
    from student
)a
where a.rn = 1;

ROW_NUMBER()窗口函數(shù)的原理是,先對數(shù)據(jù)按照partition by的字段進行分組,然后以order by的字段在各個分組內(nèi)進行排序,序號從1開始遞增。

上面的SQL返回的結果為:

圖片

這個返回結果,就完美多了。

但是,需要注意的是,有些數(shù)據(jù)庫是不支持窗口函數(shù)的。像低版本的MySQL數(shù)據(jù)庫中就無法使用。

方法四:使用IN去重

這種方法的關鍵在于,找到一組不重復的數(shù)據(jù)的特征,然后以這個特征來取數(shù)據(jù)。

比如:按address來去重,如果數(shù)據(jù)有重復,取id最大的那條。

select * 
from student
where id in (
    select max(id) 
    from student 
    group by address
);

返回結果如下:

圖片

當然,也可以取id最小的那條,將上面語句中的max改成min就可以了。

這種方法適合表里有一個數(shù)據(jù)不重復的字段(如上面SQL中的id字段)的情況。

如果表中不存在這樣一個字段,這種方法就不再適用了。但有些數(shù)據(jù)庫,天生自帶了類似的字段可以使用。

比如,在ORACLE數(shù)據(jù)庫中,可以使用ROWID替代上面SQL中的id字段。當然僅限于ORACLE數(shù)據(jù)庫:

select * 
from student
where rowid in (
    select max(rowid) 
    from student 
    group by address
);

方法五:使用NOT EXISTS去重

與方法四的思路類似,使用NOT EXISTS也可以實現(xiàn)同樣的效果。

select *
from student a
where not exists(
    select 1 
    from student b 
    where a.address = b.address 
      and a.id > b.id
);

返回結果如下:

圖片

方法六:使用ALL關鍵字

在MySQL數(shù)據(jù)庫中,有一個特殊的操作符ALL,這是一個集合操作符,表示子數(shù)據(jù)集中的所有數(shù)據(jù)都滿足某一個條件。

select *
from student a
where a.id <= ALL(
    select b.id
    from student b
    where a.address = b.address
);

返回結果如下:

圖片

在上面的SQL中,ALL操作符的意思是說,a.id字段要<=ALL操作符括號里查詢出來的所有值。

這種方法的核心思路與方法四是類似的。

方法七:使用INNER JOIN + GROUP BY關鍵字

這種方法的核心思路,也與方法四是類似的。

select
    a.*
from student a
inner join student b
on a.address = b.address
and a.id >= b.id
group by a.id,a.name,a.age,a.address
having count(*)=1;

返回結果如下:

圖片

上面介紹了7種數(shù)據(jù)去重的方法,你知道幾種?

到此這篇關于SQL數(shù)據(jù)去重的七種方法小結的文章就介紹到這了,更多相關SQL數(shù)據(jù)去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • sqlserver/mysql按天、按小時、按分鐘統(tǒng)計連續(xù)時間段數(shù)據(jù)【推薦】

    sqlserver/mysql按天、按小時、按分鐘統(tǒng)計連續(xù)時間段數(shù)據(jù)【推薦】

    最近小編接到這樣的需求,公司需要按天,按小時查看數(shù)據(jù),可以直觀的看到時間段的數(shù)據(jù)峰值。這篇文章主要介紹了sqlserver/mysql按天,按小時,按分鐘統(tǒng)計連續(xù)時間段數(shù)據(jù) ,需要的朋友可以參考下
    2019-06-06
  • SQLServer設置客戶端使用IP地址登錄的圖文詳解

    SQLServer設置客戶端使用IP地址登錄的圖文詳解

    這篇文章主要介紹了SQLServer設置客戶端使用IP地址登錄的圖文詳解,本文通過圖文并茂的形式給大家介紹的非常想詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 列出SQL Server中具有默認值的所有字段的語句

    列出SQL Server中具有默認值的所有字段的語句

    上個星期我在對一個供應商開發(fā)的數(shù)據(jù)庫按規(guī)定進行故障排除的時候,我們需要對他們數(shù)據(jù)庫中50個表的每一個都進行查看,以確保所有期望是默認值的字段都被分配了默認值。你可以想象這是一個多么令人畏懼的工作,而我立即提出了這個問題。有沒有一個比在SQL Server管理套件中打開每一個表來查看這個schema的更好方法嗎?
    2008-10-10
  • SQL語句實現(xiàn)用戶連續(xù)登錄最長天數(shù)

    SQL語句實現(xiàn)用戶連續(xù)登錄最長天數(shù)

    文章詳解如何用SQL計算用戶連續(xù)登錄最長天數(shù),結合窗口函數(shù)與日期處理,通過CTE優(yōu)化查詢邏輯,該指標可助力用戶分層、產(chǎn)品優(yōu)化、運營評估及流失預警,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-09-09
  • 編寫高質量代碼改善C#程序——使用泛型集合代替非泛型集合(建議20)

    編寫高質量代碼改善C#程序——使用泛型集合代替非泛型集合(建議20)

    這篇文章主要介紹編寫高質量的代碼有助于改善C#程序,在開發(fā)過程中集合用的比較多,如何把集合使用好,在開發(fā)過程必須掌握的技巧,下面這篇文章就給大家詳細介紹編寫高質量代碼改善C#程序——使用泛型集合代替非泛型集合(建議20),需要的朋友可以參考下
    2015-08-08
  • ByConity常用SQL語句詳解

    ByConity常用SQL語句詳解

    這篇文章主要介紹了ByConity常用SQL語句,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • SQL行轉列和列轉行代碼詳解

    SQL行轉列和列轉行代碼詳解

    這篇文章主要介紹了SQL行轉列和列轉行代碼詳解,涉及動態(tài)方案和靜態(tài)方案兩種處理方式,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • SQL Server中發(fā)送HTML格式郵件的方法

    SQL Server中發(fā)送HTML格式郵件的方法

    這篇文章主要介紹了SQL Server中發(fā)送HTML格式郵件的方法,需要的朋友可以參考下
    2014-10-10
  • SQL Server縱表與橫表相互轉換的方法

    SQL Server縱表與橫表相互轉換的方法

    這篇文章主要介紹了SQL Server縱表與橫表相互轉換的方法,本文通過圖文并茂的形式給大家介紹,介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • sql to sqlalchemy 轉換的小例子

    sql to sqlalchemy 轉換的小例子

    sql to sqlalchemy 轉換的小例子,需要的朋友可以參考一下
    2013-05-05

最新評論

平定县| 岫岩| 秀山| 景宁| 阿拉尔市| 蒙城县| 郑州市| 津南区| 阳城县| 晋中市| 东光县| 九龙县| 丽江市| 新民市| 平谷区| 同仁县| 大兴区| 千阳县| 江达县| 乌苏市| 张掖市| 兴安县| 仁怀市| 伊金霍洛旗| 南漳县| 龙岩市| 普兰店市| 彰武县| 曲阳县| 定西市| 精河县| 寿宁县| 弥勒县| 平谷区| 淮南市| 都兰县| 防城港市| 湟中县| 南昌县| 丽江市| 鄯善县|