問題:
去除資料庫表重複行中是非常常見的需求,一下是我根據一些資料總結的幾種方法。
解決:目標:表中 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就可以...