2014-11-23 119 views
1

保持一列對於表如此:同時選擇多個列不同,並在PostgreSQL的

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; 

回答

2

這應該做的伎倆

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

工作正常! 除了一個小問題 - 由於某種原因,列C現在被命名爲「max」。這是超級怪異的...我當然可以重命名它,但有沒有辦法來防止這種情況? 此外 - 如果我想保留多個列,而不僅僅是C,如果存在列D,E,F,我想保留以及該怎麼辦? – nittyjee 2014-11-23 04:46:20

+0

我不認爲有一種方法來防止這種行爲。如果你不關心最後一個值,你可以使用'max'或'min'。如果你想保留特定的值,你可能需要更復雜的查詢。 – 2014-11-23 04:56:18

+0

這很奇怪,它會重命名該列。 另外,如果我需要多列,則不能一次多次使用「max」和「min」,因爲您只能指定一次列名。 如果您有另一個可以添加多列並保留列名的選項,那麼您可以將它添加到您的答案嗎?這將是真棒:) 感謝您的幫助。 – nittyjee 2014-11-23 05:08:56

1

當您使用DISTINCT ON你應該有ORDER BY

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

不,我沒有嘗試之前,僅返回C,就像這樣: TBLB: T3A D4G – nittyjee 2014-11-23 04:39:20

+0

@NitinGadia。 。 。這應該返回A和B對的唯一值。 – 2014-11-23 04:46:15

0

使用視圖做不同的,然後將其加入到原始表選擇一行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

看起來比其他答案更復雜,並且還需要您手動輸入很多值。我實際使用的表格有成千上萬行。 – nittyjee 2014-11-23 04:51:03

+0

另一個答案是優雅,可能適合你。但是你在說什麼重新輸入值?這只是測試代碼,您可以使用自己的表並僅創建一個視圖來完成獨特功能。 – 2014-11-23 04:52:48

+0

哦,我看到哈哈 是的,我喜歡其他的,他們更簡單一點。 非常感謝您的幫助。 – nittyjee 2014-11-23 04:56:20