iT邦幫忙

0

如何用SQL指令刪除重覆的資料,保留最新的

用SQL指令選出資料後,但如何設定若是c.UPDATE_USER='SYS'且c.AM_APPLY的資料相同,則保留c.UPDATE_TIME較新的!,若c.UPDATE_USER<>'SYS',則全部保留.

最終的只是要select出來保留的,不保留的不會被select出來,也沒有要刪除檔案.

select a.ID_PROJ,c.NO_APPLY_A,c.AM_APPLY,c.UPDATE_USER,c.UPDATE_TIME
from PRJECTA a
left join PRJAPPLYA as c on a.id_proj=c.id_proj
where a.DT_YYY='108' and a.ID_DEPT_BUDG='505' and c.DT_EXEC like '201901%' and a.FG_SEAS<>'0'
order by c.UPDATE_USER DESC ,c.UPDATE_TIME

https://ithelp.ithome.com.tw/upload/images/20190218/20108157Pciln4RtiT.png

ROW_NUMBER() Over (Partition By ___ Order by ___) 這個語法試試看

2 個回答

0
浩瀚星空
iT邦大師 1 級 ‧ 2019-02-18 14:38:55

一般安全的做法。是先將維一性條件及最新的一筆資料。先加入到一個temp表後。
再來做全數移除對應資料。
最後再從暫存檔中copy過來。

一般你說的方式要選擇的情況。太多多餘條件的情況下。很難給與一定符合的處理。
所以最好還是做分開動作會比較安全。

hheyjen iT邦新手 5 級 ‧ 2019-02-18 14:52:14 檢舉

不好意思沒說明清楚,最終的只是要select出來保留的,不保留的不會被select出來,也沒有要刪除檔案.

原來不是要刪除啊。那確實是直接select就好了。
已經有人給你對應的sql碼了。我就不在重覆了。

2
純真的人
iT邦高手 1 級 ‧ 2019-02-18 15:10:10

你試試..

select ID_PROJ
,NO_APPLY_A
,AM_APPLY
,UPDATE_USER
,UPDATE_TIME
from (
	select a.ID_PROJ
	,c.NO_APPLY_A
	,c.AM_APPLY
	,c.UPDATE_USER
	,c.UPDATE_TIME
	,ROW_NUMBER() Over (Partition By a.ID_PROJ,c.AM_APPLY Order by c.UPDATE_TIME desc) Sort
	from PRJECTA a
	left join PRJAPPLYA as c on a.id_proj=c.id_proj
	where a.DT_YYY='108' 
	and a.ID_DEPT_BUDG='505' 
	and c.DT_EXEC like '201901%' 
	and a.FG_SEAS<>'0'
	and c.UPDATE_USER='SYS'
) as k
where Sort = 1
order by UPDATE_USER DESC 
,UPDATE_TIME

以下是我自己try的..

declare @PRJECTA table(
	ID_PROJ varchar(50)
)

declare @PRJAPPLYA table(
	ID_PROJ varchar(50)
	,NO_APPLY_A varchar(50)
	,AM_APPLY money
	,UPDATE_USER varchar(50)
	,UPDATE_TIME time
)

insert into @PRJECTA
values('10850501100101')

insert into @PRJAPPLYA
values('10850501100101','a01',7673,'SYS','12:43:07')
,('10850501100101','a02',7673,'SYS','14:04:37')
,('10850501100101','a03',7719,'SYS','12:43:07')
,('10850501100101','a04',7719,'SYS','14:04:37')

select a.ID_PROJ
,c.NO_APPLY_A
,c.AM_APPLY
,c.UPDATE_USER
,c.UPDATE_TIME
,ROW_NUMBER() Over (Partition By a.ID_PROJ,c.AM_APPLY Order by c.UPDATE_TIME desc) Sort
from @PRJECTA a
left join @PRJAPPLYA as c on a.ID_PROJ=c.ID_PROJ
where c.UPDATE_USER='SYS'

select ID_PROJ
,NO_APPLY_A
,AM_APPLY
,UPDATE_USER
,UPDATE_TIME
from  (
	select a.ID_PROJ
	,c.NO_APPLY_A
	,c.AM_APPLY
	,c.UPDATE_USER
	,c.UPDATE_TIME
	,ROW_NUMBER() Over (Partition By a.ID_PROJ,c.AM_APPLY Order by c.UPDATE_TIME desc) Sort
	from @PRJECTA a
	left join @PRJAPPLYA as c on a.ID_PROJ=c.ID_PROJ
	where c.UPDATE_USER='SYS'
) as k
where Sort = 1
order by UPDATE_USER DESC 
,AM_APPLY
,UPDATE_TIME

https://ithelp.ithome.com.tw/upload/images/20190218/20061369NnefoK6zPV.png

hheyjen iT邦新手 5 級 ‧ 2019-02-19 23:07:01 檢舉

謝謝您。

hheyjen iT邦新手 5 級 ‧ 2019-02-19 23:09:50 檢舉

您太棒了

我要發表回答

立即登入回答