-1

PostgreSQL で、ある時間間隔で他のテーブルの空の行に関連する 1 つのテーブル行を表示するように行をフィルタリングすることは可能ですか?

つまり、次の例を想像してください。

との 2 つのテーブルがpartnersありcallsます。

create table partners(
    id int,
    name varchar(100),
    call_id references calls (id),
    PRIMARY KEY (id)
);

create table calls(
    id int,
    name varchar(100),
    date timestamp,
    PRIMARY KEY (id),
);

では、これを想像してみてください。パートナー テーブルに作成された行がいくつかあります。一部の呼び出しが行われ、呼び出しに行が表示されました (呼び出しが行われたときに日付が登録されている場所)。しかし、私は反対をフィルタリングする必要があります。2013 年 5 月 1 日から 2013 年 6 月 1 日までの日付で通話が許可されていないパートナーを確認する方法は?

取得できないのは、任意の期間に存在しないレコードを持つパートナーをフィルター処理する方法です (期間が必要ない場合は簡単です。通話のないパートナーをフィルター処理するだけで済みます)。外部時間などを使用する必要がありますか?

4

3 に答える 3

3

何かのようなもの:

select p.*
from partners p
where not exists (select 1 
                  from calls c
                  where c.name = p.name 
                    and c.date between DATE '2013-05-01' and DATE '2013-06-01');
于 2013-08-23T11:21:58.100 に答える
0

あなたは非常に難解なデータ構造を持っています。呼び出されるテーブルにはpartners、パートナーごとに 1 つの行が必要です。あなたがパートナーと呼んでいるものは、実際には別のテーブルであるべきです。

したがって、最初に行うことは、パートナーのリストを取得することです。次にleft outer join、他のテーブルに接続するために使用します。一致がない場合は、行を保持します。

select p.*
from (select distinct name
      from partners
     ) as allpartners left outer join
     p
     on p.name = allpartners.name left outer join
     calls c
     on p.call_id = c.id and
        c.date between DATE1 and DATE2
where c.name is NULL;
于 2013-08-23T11:21:15.440 に答える