Postgresql选择另一列的重复列

时间:2016-06-15 15:46:01

标签: postgresql

我有一个像

这样的数据集
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)

然后我找不到按状态过滤的方法来删除重复项。

感谢。

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列,则排序会更自然。