My goal is to choose the highest record(By SALE) from table partition by company(CNAME) and delete other records.
x
create table Tn(cname varchar(30), sale int);
Table Values:
CNAME SALE
1. Apple 4000
2. Apple 5000
3. Apple 4200
4. Samsung 3800
5. Samsung 3900
6. Samsung 3000
7. Samsung 3200
8. Nokia 800
9. Nokia 2000
10. Xiaomi 1100
11. Xiaomi 700
12. Lenovo 600
13. Lenovo 200
14. Lenovo 100
My Code:
with Cte as
(
select cname,sale, dense_rank() over(partition by cname order by sale desc)as Ranker
from Tn
)
delete from cte where Ranker>1
select * from Tn;
Now this issue is I’m getting
ORA-00928: missing SELECT keyword
this error if I don’t use this select * from Tn;
Even if I use I see no changes in the table.
I’m Oracle SQL Live platform to use my query. Please suggest the issue of my query.
Please suggest any other way without using Common Table Expression.
UPDATE
I have tried out this also:
delete from tn
where sale not in (select max(sale)as A
from tn
group by cname
order by A desc);
But it is saying
ORA-00907: missing right parenthesis
Advertisement
Answer
If you want to delete from original table then CTE
will not help you.
You will need something like following:
Delete from tn where rowid in
(Select rid from
(select cname,
sale,
dense_rank() over(partition by cname order by sale desc)as Ranker,
rowid as rid
from Tn)
where ranker > 1)
Cheers!!