Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同时在多个列上选择distinct,并在PostgreSQL中保留一列_Sql_Postgresql - Fatal编程技术网

同时在多个列上选择distinct,并在PostgreSQL中保留一列

同时在多个列上选择distinct,并在PostgreSQL中保留一列,sql,postgresql,Sql,Postgresql,对于这样的表: tblA A,B,C 1,2,t3a 1,3,d4g 1,2,b5e 1,3,s6u 我想生成一个同时在a和B上选择distinct的表,并且仍然保留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

对于这样的表:

tblA  

A,B,C  
1,2,t3a  
1,3,d4g  
1,2,b5e  
1,3,s6u 
我想生成一个同时在a和B上选择distinct的表,并且仍然保留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时,您应该有以下订购人:

当您在上使用DISTINCT时,您应该有以下订购人:


这应该能奏效

CREATE TABLE tblB AS (
    SELECT A, B, max(C) AS max_of_C FROM tblA GROUP 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);
)

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


不,我以前试过,只返回C,像这样:tblB:t3ad4g@NitinGadia . . . 这应该为A和B对返回唯一的值。不,我以前试过,只返回C,如:tblB:t3ad4g@NitinGadia . . . 这应该为A和B对返回唯一的值。这是有效的!!除了一个小问题——出于某种原因,C列现在被命名为max。这太奇怪了。。。我当然可以给它改名,但有没有办法防止这种情况发生?还有,如果我想保留多个列,而不仅仅是C,比如如果我也想保留一个D、E、F列,那该怎么办?我认为没有办法防止这种行为。如果不关心最后一个值,可以使用max或min。如果要保留特定的值,可能需要更复杂的查询。很奇怪,它会重命名列。另外,如果我需要几个列,您不能多次使用max和min,因为您只能指定一次列名。如果您有另一个选项可以添加多个列并保留列名,那么您可以将其添加到您的答案中吗?那太棒了:谢谢你的帮助。你必须使用别名,我编辑了答案来解释这个方法。但是:选择周围的括号是不需要的,并且在我看来增加了无用的噪音。这很有效!!除了一个小问题——出于某种原因,C列现在被命名为max。这太奇怪了。。。我当然可以给它改名,但有没有办法防止这种情况发生?还有,如果我想保留多个列,而不仅仅是C,比如如果我也想保留一个D、E、F列,那该怎么办?我认为没有办法防止这种行为。如果不关心最后一个值,可以使用max或min。如果要保留特定的值,可能需要更复杂的查询。很奇怪,它会重命名列。另外,如果我需要几个列,您不能多次使用max和min,因为您只能指定一次列名。如果您有另一个选项可以添加多个列并保留列名,那么您可以将其添加到您的答案中吗?那太棒了:谢谢你的帮助。你必须使用别名,我编辑了答案来解释这个方法。但是:在我看来,选择周围的括号是不需要的,并且添加了无用的噪音。这看起来比其他答案复杂得多,还需要你手动输入很多值。我实际使用的表有数千行。另一个答案很优雅,可能适合你。但你在说什么重新输入价值观???这只是测试代码,你可以使用你自己的表,只创建一个视图来进行区分。哦,我明白了,哈哈,我喜欢其他的,它们更简单一些。非常感谢您的帮助。没问题,就像我说的,它们是优雅的解决方案,如果我先看到它们,我就不会费心回答了。这看起来比其他答案复杂得多,而且还需要您手动输入许多值。我实际使用的表有数千行。另一个答案很优雅,可能适合你。但你在说什么重新输入价值观???这只是测试代码,你可以使用你自己的表,只创建一个视图来进行区分。哦,我明白了,哈哈,我喜欢其他的,它们更简单一些。非常感谢你的帮助。没问题,就像我说的,它们是优雅的解决方案,如果我先看到它们,我就不会费心回答了。