同时在多列上选择不同的,并在 PostgreSQL 中保留一列

问题描述 投票:0回答:5

对于这样的表:

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;  
sql postgresql
5个回答
7
投票

当您使用

DISTINCT ON
时,您应该有
ORDER BY

SELECT DISTINCT ON (A,B), C
INTO tblB
FROM tblA
ORDER BY A, B;

4
投票

这应该可以解决问题

CREATE TABLE tblB AS (
    SELECT A, B, max(C) AS max_of_C FROM tblA GROUP BY A, B
)

0
投票

使用视图做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);
)

0
投票
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 消除与所有指定表达式匹配的行。”


0
投票

根据 postgresql documentation,您需要指定 prantenses 内部和外部的名称。

SELECT DISTINCT ON (A,B) A,B,C  
INTO tblB  
FROM tblA;

下图是另一个示例,其中包含我项目中的虚假数据,表明预期的语法可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.