我有一个像
这样的数据集ID STATUS SOURCE
1 new data1
1 old data2
2 old data1
2 new data2
我希望能够通过STATUS列选择那些重复ID并保留SOURCE,最终列表将是:
ID STATUS SOURCE
1 new data1
2 new data2
我可以使用以下内容制作重复ID列表:
select id, status, source
from data
where id in (
select id
from data
group by id
having (count(* ) > 1)
然后我找不到按状态过滤的方法来删除重复项。
感谢。
答案 0 :(得分:1)
您可以将Postgresql的DISTINCT ON
功能与ORDER BY
子句结合使用。
SELECT DISTINCT ON (id)
id,
status,
source
FROM data
ORDER BY id, status
这是一个不使用任何Postgres特定功能的等效查询:
SELECT id,
status,
source
FROM (SELECT id,
status,
source,
row_number() OVER (PARTITION BY id ORDER BY status) AS n
FROM data) AS sub
WHERE sub.n = 1
ORDER BY
子句对这个数据集(在两个查询变体中)都有些笨拙,因为它使用字母排序来表达" new
的语义顺序比old
更新{1}}&#34 ;.如果我们使用时间戳列created_at
(或类似)而不是status
列,则排序会更自然。