如果按类别重复,如何删除一行?

How can I drop a row if repeated by category?

我将如何删除具有重复的行并按其类别保留另一行。

例如,让我们考虑一个示例 table

Item | location | Status
------------------------
123  |   A       |  done
123  |   A       |  not_done
123  |   B       |  Other
435  |   D       |  Other

所以基本上我想要得到的是这个 table

Item | location | Status
------------------------
123  |   A       |  done
435  |   D       |  Other

如果状态已完成,我对其他状态或位置不感兴趣。如果它没有“完成”,那么我会展示下面的。

如果可以在 SQL 查询中创建类似的内容,有什么线索吗?

识别带有 done 的行(如果有)并确定它们的优先级。

select * except rn
from (
  select item, location, status
       , row_number() over (
           partition by item
           order by case status when 'done' then 0 else 1 end
         ) as rn
  from t
)
where rn = 1

(我没试过,语法错误请见谅。)

是的,您可以先 enabling standard SQL 之后通过下面的存在条件来完成。

select * from
yourtable A 
where not exists
(
select 1 from yourtable B 
where A.id=B.id and A.location=B.location
and A.status<>B.status 
AND B.status <> 'done'
)