2016-04-06 4 views
1

Я искал похожие вопросы и не смог найти решение.SQL Server удаляет повторяющиеся строки

Вот мои данные:

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 

Я пытаюсь выбрать лицензии автомобиля в диапазоне дат экс 2/1/2015 до 8/1/2015 и mechanic_id 9.

Даже хотя car_license 111 для repair_id 1 не входит в число 1/1/2015 по 8/1/2015, он все равно должен быть возвращен, так как 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

моя дата - это формат smalldatetime –

ответ

0

Я считаю, t нужно заявление 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 
+0

Нам действительно нужно 'mechanic_id' в' PARTITION BY' –

+0

Не совсем, поскольку OP его фильтрует. Спасибо за уловку. –

+0

Это сработало, Thx !!!! –

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 
+0

кажется, что он удалит все, где число больше одного: УДАЛИТЬ ОТ cte, где rn> 1 Нужно удалить только повторяющиеся строки –

+0

@JamesRodriguez - Нет, это не будет. Проверьте обновление в моем ответе –

Смежные вопросы