如果按类别重复,如何删除一行?
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'
)
我将如何删除具有重复的行并按其类别保留另一行。
例如,让我们考虑一个示例 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'
)