同时在多个列上选择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,因为您只能指定一次列名。如果您有另一个选项可以添加多个列并保留列名,那么您可以将其添加到您的答案中吗?那太棒了:谢谢你的帮助。你必须使用别名,我编辑了答案来解释这个方法。但是:在我看来,选择周围的括号是不需要的,并且添加了无用的噪音。这看起来比其他答案复杂得多,还需要你手动输入很多值。我实际使用的表有数千行。另一个答案很优雅,可能适合你。但你在说什么重新输入价值观???这只是测试代码,你可以使用你自己的表,只创建一个视图来进行区分。哦,我明白了,哈哈,我喜欢其他的,它们更简单一些。非常感谢您的帮助。没问题,就像我说的,它们是优雅的解决方案,如果我先看到它们,我就不会费心回答了。这看起来比其他答案复杂得多,而且还需要您手动输入许多值。我实际使用的表有数千行。另一个答案很优雅,可能适合你。但你在说什么重新输入价值观???这只是测试代码,你可以使用你自己的表,只创建一个视图来进行区分。哦,我明白了,哈哈,我喜欢其他的,它们更简单一些。非常感谢你的帮助。没问题,就像我说的,它们是优雅的解决方案,如果我先看到它们,我就不会费心回答了。