对于这样的表:
tblA
A,B,C
1,2,t3a
1,3,d4g
1,2,b5e
1,3,s6u
我想生成一个表,同时在 A 和 B 上选择不同的值,并仍然保留 C 的一个值,如下所示:
tblB
A,B,C
1,2,t3a
1,3,d4g
看起来这很简单,但我一辈子都找不到。
DROP TABLE IF EXISTS tblA CASCADE;
SELECT DISTINCT ON (A,B), C
INTO tblB
FROM tblA;
当您使用
DISTINCT ON
时,您应该有ORDER BY
:
SELECT DISTINCT ON (A,B), C
INTO tblB
FROM tblA
ORDER BY A, B;
这应该可以解决问题
CREATE TABLE tblB AS (
SELECT A, B, max(C) AS max_of_C FROM tblA GROUP BY A, B
)
使用视图做distinct,然后将其连接到原始表以选择C列的一行。插入到目标中就留给你自己弄清楚了。哦,你可以从 t 中选取多列,而不仅仅是 c - 唯一的事情是你的子查询需要找到一种方法将其限制为只有一行。
create table t (a int, b int, c int);
create view tv as select distinct a, b from t;
insert into t (a, b, c) values(1, 2, 10);
insert into t (a, b, c) values(1, 2, 20);
insert into t (a, b, c) values(1, 3, 30);
insert into t (a, b, c) values(1, 3, 40);
CREATE TABLE tblB AS (
select tv.a, tv.b, t.c from tv, t
where tv.a = t.a and tv.b = t.b
/* pick smallest ctid which is a unique row id built into postgres */
and t.ctid = (select min(ctid) from t s where s.a = t.a and s.b = t.b);
)
drop table t;
create table t (a int, b int, c int);
insert into t (a, b, c) values(1, 2, 3);
insert into t (a, b, c) values(1, 3, 4);
insert into t (a, b, c) values(1, 2, 5);
insert into t (a, b, c) values(1, 3, 6);
select distinct on (a,b) a, b, c
from t;
来自 文档:“SELECT DISTINCT 从结果中消除重复行。SELECT DISTINCT ON 消除与所有指定表达式匹配的行。”
根据 postgresql documentation,您需要指定 prantenses 内部和外部的名称。
SELECT DISTINCT ON (A,B) A,B,C
INTO tblB
FROM tblA;
下图是另一个示例,其中包含我项目中的虚假数据,表明预期的语法可以正常工作。