SQL Server删除重复的行

时间:2016-04-06 01:42:44

标签: sql sql-server duplicates

我找了类似的问题,找不到解决方案。

这是我的数据:

repair_id   car_license   repair_date   mechanic_id
---------------------------------------------------
1           111            1/9/2015       9
2           111            3/3/2015       9
3           111            7/7/2015       9
4           111            7/7/2015       9
5           111            7/7/2015       9
6           222            2/1/2015       9
7           222            4/3/2015       9
8           333            11/7/2015      8

我正在尝试在2015年2月1日至2015年8月1日和mechanic_id 9的日期范围内选择汽车牌照。

即使repair_id 1的car_license 111不在2015年2月1日到2015年8月1日之间,它仍然应该返回,因为car_license 111也有repair_id 2& 3日期范围内。

我还必须从结果集中删除重复的第4行和第5行

repair_id   car_license   repair_date  mechanic_id
---------------------------------------------------
1           111            1/9/2015     9
2           111            3/3/2015     9
3           111            7/7/2015     9
6           222            2/1/2015     9
7           222            4/3/2015     9

我尝试了这个但不确定如何继续

select 
    repair_id, car_license, repair_date
from 
    car_table
where 
    repair_date between '2/1/2015' and '8/1/2015'
    and mechanic_id = 9

但如何删除该代码中的重复行?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

使用ROW_NUMBER窗口功能识别重复项

试试这个

;WITH cte AS
(
select row_number()over(partition by car_license,repair_date order by repair_id) RN,*
From car_table
where repair_date between '2/1/2015' and '8/1/2015'
and mechanic_id = 9
)
DELETE FROM cte where rn > 1

要检查将要删除的记录,您可以运行以下uery并检查

;WITH cte AS
(
select row_number()over(partition by car_license,repair_date order by repair_id) RN,*
From car_table
where repair_date between '2/1/2015' and '8/1/2015'
and mechanic_id = 9
)
SELECT * FROM cte where rn > 1

答案 1 :(得分:0)

我相信您不需要DELETE声明,只需要一个简单的SELECT。这可能会对您有所帮助:

WITH Cte AS(
    SELECT *,
        rn = ROW_NUMBER() OVER(PARTITION BY car_license, repair_date ORDER BY repair_id)
    FROM car_table ct1
    WHERE EXISTS(
        SELECT 1
        FROM car_table ct2
        WHERE
            ct2.car_license = ct1.car_license
            AND ct2.mechanic_id = ct2.mechanic_id
            AND ct2.repair_date BETWEEN '20150201' AND '20150801'
            AND ct2.mechanic_id = 9
    )
)
SELECT * FROM CTE WHERE rn = 1