I have the following table:
TABLE cars
id | name | prodDate | fuelType | registered |
1 'Abarth' 2012 1 true
2 'Acura' 2022 2 true
3 'Acura' 2022 2 false
4 'Alfa Romeo' 2013 2 false
5 'Aston Martin' 2005 1 true
6 'Bentley' 2007 1 false
7 'BMW' 2019 2 false
8 'BMW' 2016 2 false
9 'Chevrolet' 2021 2 true
10 'Citroen' 2018 2 false
11 'Ferrari' 2015 2 true
12 'Ferrari' 2015 2 false
13 'Ferrari' 2014 2 false
14 'GMC' 2008 2 true
I need to write SQL script to delete all the duplicate rows (duplicate rows are the ones with the same name value) in which the registered is true. I must consider fuelType = 1 only.
For example row id = 11 will be deleted because there are duplicate Ferrari rows and this is the one with registered = true. Row id = 9 won't be deleted, as there are no duplicate rows with name = Chevrolet.
How can I do this?
CodePudding user response:
We use rank() to find all the duplicates where registered = true and get rid of them.
select id
,name
,proddate
,fueltype
,registered
from (
select *
,rank() over(partition by name order by registered) as rnk
from cars
) cars
where rnk = 1
| id | name | proddate | fueltype | registered |
|---|---|---|---|---|
| 1 | Abarth | 2012 | 1 | true |
| 3 | Acura | 2022 | 2 | false |
| 4 | Alfa Romeo | 2013 | 2 | false |
| 5 | Aston Martin | 2005 | 1 | true |
| 6 | Bentley | 2007 | 1 | false |
| 8 | BMW | 2016 | 2 | false |
| 7 | BMW | 2019 | 2 | false |
| 9 | Chevrolet | 2021 | 2 | true |
| 10 | Citroen | 2018 | 2 | false |
| 12 | Ferrari | 2015 | 2 | false |
| 13 | Ferrari | 2014 | 2 | false |
| 14 | GMC | 2008 | 2 | true |
CodePudding user response:
when I normally get into such a situation I normally use a GROUP BY with HAVING take this example, I hope it helps
SELECT fstName,
lstName,
COUNT(*) AS Count
FROM Employee
GROUP BY fstName,lstName
HAVING COUNT(*) > 1; //those that have count more than once
