2016-04-06 11 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 

私は2015年8月1日に日付範囲EX 2015年2月1日以内に車の免許を選択しようとしているとさえcar_licenseかかわら9

をmechanic_idています111のrepair_id 1の値が2/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

あなたの日は 'MM/DD/YYYY'ですか? –

+0

私の日付はsmalldatetime形式です –

答えて

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

本当に 'PARTITION BY'に' mechanic_id'が必要でしょうか。 –

+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

これは、カウントが1より大きいすべてを削除するように思えます:DELETE FROM cte where rn> 1重複した行だけを削除する必要があります –

+0

@JamesRodriguez - そうではありません。私の答えの更新を確認してください –

関連する問題