SQL-仅当另一列匹配时才删除重复的列

时间:2018-08-13 08:32:10

标签: sql sql-server

我有一个下表(TBL_VIDEO),其中“ TIMESTAMP”中有重复的列条目,并且仅当“ CAMERA”编号匹配时,我才想删除它们。

之前:

ANALYSIS_ID | TIMESTAMP | EMOTION | CAMERA
-------------------------------------------    
 1          | 5         | HAPPY   | 1
 2          | 10        | SAD     | 1
 3          | 10        | SAD     | 1
 4          | 5         | HAPPY   | 2
 5          | 15        | ANGRY   | 2
 6          | 15        | HAPPY   | 2

之后:

ANALYSIS_ID | TIMESTAMP | EMOTION | CAMERA
-------------------------------------------    
 1          | 5         | HAPPY   | 1
 2          | 10        | SAD     | 1
 4          | 5         | HAPPY   | 2
 5          | 15        | ANGRY   | 2

我已经尝试过此语句,但是不会相应地删除列。感谢所有帮助您生成正确的SQL语句的帮助。预先感谢!

delete y
from TBL_VIDEO y 
where exists (select 1 from TBL_VIDEO y2 where y.TIMESTAMP = y2.TIMESTAMP and y2.ANALYSIS_ID < y.ANALYSIS_ID, y.CAMERA = y.CAMERA, y2.CAMERA = y2.CAMERA);

5 个答案:

答案 0 :(得分:2)

尝试一下:

delete f2 from (
select row_number() over(partition by TIMESTAMP, CAMERA order by ANALYSIS_ID) rang
from yourtable f1
) f2 where f2.rang>1

答案 1 :(得分:1)

其他解决方案:

delete f1 from yourtable f1
where exists 
(
  select * from yourtable f2
  where f2.TIMESTAMP=f1.TIMESTAMP and f2.CAMERA=f1.CAMERA and f1.ANALYSIS_ID>f2.ANALYSIS_ID
)

答案 2 :(得分:0)

使用row_number并找到重复项并将其删除

delete from
(select *,row_number() over(partition by TIMESTAMP,CAMERA order by ANALYSIS_ID) as rn from TBL_VIDEO
) t1 where rn>1

答案 3 :(得分:0)

;WITH cte
AS
(
    select ANALYSIS_ID,
    ROW_NUMBER() over(partition by TIMESTAMP, CAMERA order by ANALYSIS_ID) rnk
)

DELETE FROM cte WHERE cte.rnk > 1

答案 4 :(得分:0)

您可以使用subquery

select v.*
from tbl_video v
where analysis_id = (select min(v1.analysis_id)
                     from tbl_video v1
                     where v1.timestamp = v.timestamp and
                           v1.camera = v.camera 
                    );

但是,带有top (1) with ties子句的解析函数也很有用:

select top (1) with ties v.*
from tbl_video v
order by row_number() over (partition by v.timestamp, v.camera order by v.analysis_id);

因此,您的delete版本为:

delete v    
from tbl_video v
where analysis_id = (select min(v1.analysis_id)
                     from tbl_video v1
                     where v1.timestamp = v.timestamp and
                           v1.camera = v.camera 
                    );