我找了类似的问题,找不到解决方案。
这是我的数据:
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
但如何删除该代码中的重复行?
感谢您的帮助
答案 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