2015-01-07 3 views
0

Мне нужно избавиться от строк, которые имеют одинаковое значение только в определенных столбцах. Например, в приведенном ниже примере я хотел бы выбрать все строки, кроме последней, которая равна второй-последней строке для столбцов CODE, START_DATE и TYPE (это означает игнорирование значения для столбца END_DATE).PostgreSQL выбирает строки с одинаковыми столбцами

code   | start_date  | end_date  | type 
---------------+----------------+--------------+------ 
C086000-T10001 | 2014-11-11  | 2014-11-12 | 01 
C086000-T10001 | 2014-11-11  | 2014-11-11 | 03 
C086000-T10002 | 2014-12-03  | 2014-12-10 | 03 
C086000-T10002 | 2014-01-03  | 2014-01-04 | 03 
C086000-T10003 | 2012-02-27  | 2014-02-28 | 03 
C086000-T10003 | 2014-08-11  | 2014-11-12 | 01 
C086000-T10003 | 2014-08-11  | 2014-08-20 | 01 

Как я могу это выполнить?

Edit: Следующий запрос возвращает слишком много столбцов для подзапроса сообщения ошибки:

SELECT * FROM my_table WHERE code NOT IN (SELECT DISTINCT code, start_date, type FROM my_table) ; 

Большое спасибо за помощь!

+0

Нет, извините (исправлена ​​ошибка из-за копирования пасты моего образца). – wiltomap

ответ

1

Это может быть сделано с помощью Postgres' distinct on оператора:

select distinct on (code, start_date, type) code, start_date, end_date, type 
from the_table 
order by code, start_date, type; 

Если вы предпочитаете использовать стандартный SQL, это также может быть сделано с помощью окна функции:

select code, start_date, end_date, type 
from (
    select code, start_date, end_date, type, 
      row_number() over (partition by code, start_date, type order by end_date) as rn 
    from the_table 
) t 
where rn = 1 
order by code, start_date, type; 

SQLFiddle примера: http://sqlfiddle.com/#!15/c5044/1

+0

вот и все, спасибо большое! – wiltomap

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