2014-11-23 2 views
1

Для таблицы, такие как это:Выберите отличие от нескольких столбцов одновременно, и держать один столбец в PostgreSQL

tblA 

A,B,C 
1,2,t3a 
1,3,d4g 
1,2,b5e 
1,3,s6u 

Я хочу, чтобы произвести таблицу, которая выбирает отличие от А и В одновременно, и по-прежнему держать одну значение С, например:

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

+0

Я не думаю, что есть способ предотвратить это поведение. Если вы не заботитесь о последнем значении, вы можете использовать 'max' или' min'. Если вы хотите сохранить определенные значения, вам может потребоваться более сложный запрос. –

+0

Это очень странно, что он переименовал бы столбец. Кроме того, если мне нужно несколько столбцов, вы не можете использовать «max» и «min» более одного раза, так как вы можете указать имя столбца один раз. Если у вас есть другой параметр, который может добавить несколько столбцов и сохранить имена столбцов, вы можете добавить это к своему ответу? Это было бы здорово :) Спасибо за вашу помощь. – nittyjee

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

+0

@NitinGadia. , , Это должно возвращать уникальные значения для пар A и B. –

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

+0

Другой ответ элегантен и может вам подойдет. Но что вы говорите о переходе ценностей? Это всего лишь тестовый код, вы бы использовали свою собственную таблицу и только создали представление, чтобы сделать отдельный. –

+0

oh я вижу haha ​​ да, мне нравятся другие, они немного более просты. благодарит за вашу помощь. – nittyjee

Смежные вопросы