Можно использовать row_number()
:
select
id,
OrderDate,
RejectDate
from (
select
t.*,
row_number() over(
partition by id
order by case when RejectDate = '1900-01-01' then '9999-12-31' else RejectDate end desc
) rn
from tableA t
) t
where rn > 1
Преимущество этого метода заключается в том, что он позволяет избежать агрегирования, что может привести к повышению производительности. Кроме того, вы можете легко превратить это в оператор delete
, используя концепцию обновляемого CTE следующим образом:
with cte as (
select
row_number() over(
partition by id
order by case when RejectDate = '1900-01-01' then '9999-12-31' else RejectDate end desc
) rn
from tableA t
)
delete from cte where rn > 1