比较多行的开始和结束日期

时间:2013-07-29 15:35:06

标签: sql postgresql left-join exists postgresql-8.4

我有一个订阅联系人表。联系人可以有多个订阅:

CREATE TABLE contact (
    id INTEGER NOT NULL,
    name TEXT,
    PRIMARY KEY (id)
);

CREATE TABLE subscription (
    id INTEGER NOT NULL,
    contact_id INTEGER NOT NULL REFERENCES contact(id),
    start_date DATE,
    end_date DATE,
    PRIMARY KEY (id)
);

我需要获得订阅的联系人的所有订阅 从与该另一个订阅的结束日期相同的日期开始 接触。

所以对于给定的数据:

INSERT INTO contact (id, name) VALUES 
(1, 'John'),
(2, 'Frank');

INSERT INTO subscription (id, contact_id, start_date, end_date) VALUES 
(1, 1, '2012-01-01', '2013-01-01'),
(2, 1, '2013-01-01', '2014-01-01'),
(3, 2, '2012-01-01', '2012-09-01'),
(4, 2, '2013-01-01', '2014-01-01');

我希望订阅ID为2,3,4但不是1,因为联系人'John' 在start_date的同一天(2013-01-01)订阅了end_date 订阅id为1。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

SQL Fiddle

select *
from subscription s0
where not exists (
    select 1
    from subscription s1
    where
        s0.contact_id = s1.contact_id
        and s1.start_date = s0.end_date
)
order by contact_id, id