總結 去除表中重複行

2021-06-14 13:38:05 字數 2213 閱讀 1046

問題:

去除資料庫表重複行中是非常常見的需求,一下是我根據一些資料總結的幾種方法。

解決:目標:表中 empname 與 orderdate 相同的記錄只保留一行。

資料初始化:

select empname,orderdate,identity(int,1,1) as keycol

into #duptb

from (

select '張三' as empname,'2006-07-04' as orderdate union all

select '張三','2006-07-08' union all

select '張三','2006-07-08' union all

select '李四','2006-07-08' union all

select '李四','2006-07-09' union all

select '李四','2006-07-10' union all

select '王五','2006-07-11' union all

select '王五','2006-07-11' union all

select '狗二','2006-07-15' union all

select '狗二','2006-07-16'

)as tt

go

一、如果結果集中需要empname與orderdate兩列時,直接用distinct就可以了。

select distinct empname,orderdate

from(

select empname,orderdate

from #duptb)as tt

--(8 行受影響)

二、或者使用group by

select empname,orderdate

from #duptb

group by empname,orderdate

--(8 行受影響)

三、如果要求結果集包含除分組列的其他屬性(使用視窗函式 )

----------表中 empname與orderdate重複的記錄,只保留一條

--不使用keycol ms sqlserver2008

with tb as

(select empname,orderdate,keycol,

row_number() over(partition by empname,orderdate order by empname,orderdate) as rn

from #duptb

)select *

from tb

where rn <2 --(8 行受影響)

--(8 行受影響)

四、如果要求結果集包含除分組列的其他屬性(使用子查詢)

--method2 --使用keycol

select t1.empname,t1.orderdate

from #duptb as t1

where not exists(

select *

from #duptb as t2

where t1.empname = t2.empname

and t1.orderdate = t2.orderdate

and t1.keycol < t2.keycol

)--(8 行受影響)

五、如果要求結果集包含除分組列的其他屬性(使用子查詢)

--表中 empname與orderdate重複的記錄,只保留一條,使用keycol

select t1.empname,t1.orderdate,t1.keycol

from #duptb as t1

where keycol in(select min(keycol)

from #duptb as t2

group by empname,orderdate

)--(8 行受影響)

總結:

以上四種方法在資料量不同、索引不同等其他因素存在時有很大效能差異。

比如說,資料量少時,方法四一般會比方式三更具效能優勢,儘管其看似要進行兩次表掃瞄或查詢。

方式五是所有方式中效能最差的。

如果結果集僅需要分組列,建議選擇方式

一、方式

二、方式三。

如果結果集需要除分組列的其他列,可以考慮方式三與方式四。 

根據表中某列去除重複的行

根據表中某列 或者某些列 去除重複的行 例如有表a,有兩行相同的cardid,我們只要隨機的某一行 drop table a drop table b create table a cardid varchar 100 cardcode varchar 100 insert into a cardi...

pandas 去除重複行

方法 dataframe.drop duplicates subset none,keep first inplace false 1引數 這個drop duplicate方法是對dataframe格式的資料,去除特定列下面的重複行。返回dataframe格式的資料。subset column la...

sql 去除重複行

最近做乙個資料庫的資料匯入功能,發現聯合主鍵約束導致不能匯入,原因是源表中有重複資料,但是源表中又沒有主鍵,很是麻煩。經過努力終於解決了,現在就來和大家分享一下,有更好的辦法的可以相互交流。有重複資料主要有一下幾種情況 1.存在兩條完全相同的紀錄 這是最簡單的一種情況,用關鍵字distinct就可以...