gpt4 book ai didi

sql - postgres查询根据某些列的多个副本获取第一行

转载 作者:行者123 更新时间:2023-11-29 14:21:51 25 4
gpt4 key购买 nike

假设我有一张 table -

A        B       C  
1 3 5
1 3 7
1 3 9
2 4 3
2 4 6
2 4 1

对于 A 和 B 的相同组合,这里有多个副本。对于每个组合,我想要返回它的第一个条目。所以我希望这张表的结果是-

A        B      C  
1 3 5
2 4 3

我如何在 postgres sql 中执行此操作?

最佳答案

假设您可以根据对 a、b 和 c 的排序定义“第一”,为此您需要 DISTINCT ON

SELECT
DISTINCT ON ("A", "B")
"A", "B", "C"
FROM Table1
ORDER BY "A", "B", "C";

例如http://sqlfiddle.com/#!15/9ca16/1

参见 SELECT有关 DISTINCT ON 的更多信息。


如果您犯了假设 SQL 表具有固有顺序的严重错误,那么您将需要在继续之前修复您的表。您可以使用 PostgreSQL ctid 伪列来指导创建与当前磁盘表顺序相匹配的主键。应该是安全的:

ALTER TABLE mytable ADD COLUMN id SERIAL PRIMARY KEY;

因为 PostgreSQL 倾向于按表顺序写入键。不能保证,但是在没有主键的情况下也不能保证。然后你可以:

SELECT
DISTINCT ON ("A", "B")
"A", "B", "C"
FROM Table1
ORDER BY id;

(编辑:我不建议在嵌入到应用程序中的查询中使用 ctid。它是解决特定问题的便捷工具,但它在 PostgreSQL 中并不是真正的公共(public) API,而且它不是SQL 标准。它不像 Oracle 中的 ROWID,它会因 vacuum 等而发生变化。PostgreSQL 在未来的版本中可以自由地破坏/更改/删除它。)

关于sql - postgres查询根据某些列的多个副本获取第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com