PostgreSQL一个ID多个值

PostgreSQL一个ID多个值,postgresql,Postgresql,我有一个Postgres表,其中一个id可能有多个通道值,如下所示 ID |Channel | Column 3 | Column 4 _____|________|__________|_________ 1 | Sports | x | null 1 | Organic| x | z 2 | Organic| null | q 3 | Arts | b | w 3 | Organic| e

我有一个Postgres表,其中一个id可能有多个通道值,如下所示

ID   |Channel | Column 3 | Column 4
_____|________|__________|_________
1    | Sports | x        | null
1    | Organic| x        | z
2    | Organic| null     | q
3    | Arts   | b        | w
3    | Organic| e        | r
4    | Sports | sp       | t
没有ID将有一个重复的频道名称,没有ID将是体育和艺术。也就是说,ID1可以有一个体育和有机频道,一个体育和艺术频道,但不能有两个体育或两个有机条目,也不能有体育和艺术频道。我希望所有ID都在查询中,但如果有非有机通道,我更喜欢这样。我想要的结果是

ID   |Channel | Column 3 | Column 4
_____|________|__________|_________
1    | Sports | x        | null
2    | Organic| null     | q
3    | Arts   | b        | w
4    | Sports | sp       | t
我觉得这里有一些CTE,一个秩和分区,或者一些可以实现这个目的的东西,但我就是不明白。我只包括第3列和第4列,以显示有额外的列


有人对此处部署的代码有什么想法吗?

您可以使用
DISTINCT on
和适当的
ORDER BY
子句:

SELECT DISTINCT ON (id)
       id, channel, column3, column4
FROM atable
ORDER BY id, channel = 'Organic';

这取决于这样一个事实,即
FALSE

我最终使用了一个排名高于函数 行号()在(按salesforce划分的id按大小写顺序,当通道为有机通道时,则为0,否则为1 end desc,timestamp desc),作为id列


我没有在原始问题中包括我有时间戳!现在可以了。谢谢

谢谢劳伦兹。这对我给你的信息起了作用。我在最初的问题中没有包括更多的信息。你的回答是正确的,但我需要一个稍微不同的解决方案来得到我想要的。