0

インポートされたファイルのインデックスと、インポートされた各ファイルの日付とブランチを含むテーブルがあります。

現在、複数の支店を統合する必要があるため、休日があるときにいくつかの支店からの情報を複製して、データの一貫性を保つ必要があります。基本的に、これらのギャップを最新の利用可能な情報で埋める必要があります。

それらの間を移動して以前のデータを取得するために、ランキングでいくつかの自己結合を試みましたが、うまくいきませんでした。

私が持っているのはテーブルです:

rundate, branch, imported 
2015-04-01, PL1, TRUE 
2015-04-01, ES1, TRUE 
2015-04-01, CZ4, TRUE 
2015-04-02, PL1, TRUE 
2015-04-02, ES1, TRUE 
2015-04-02, CZ4, TRUE   
2015-04-03, ES1, TRUE 
2015-04-03, CZ4, TRUE

この例では、次を返すクエリを作成したいと思います。

gap_date, branch, real_date
2015-04-03, PL1, 2015-04-02

このテーブルは非常に小さい (数千行) ため、パフォーマンスは大きな問題にはなりません。

どうすればそれを達成できるかについてのアイデアはありますか?

現在、ギャップ日付の実行日とブランチをパラメーターとして受け取り、パラメーターとして渡された日付より前の最新のものを返す関数を使用しています (実行日 <= '$1' の場合、max(rundate) を使用)。

ありがとう!

4

3 に答える 3

1

outer joinsubqueryおよびを使用できますcross join

スキーマ:

create table tbl(rundate date, 
                 branch varchar(10), 
                 imported bool);
insert into tbl values('2015-04-01', 'PL1', TRUE),
('2015-04-01', 'ES1', TRUE), 
('2015-04-01', 'CZ4', TRUE), 
('2015-04-02', 'PL1', TRUE), 
('2015-04-02', 'ES1', TRUE), 
('2015-04-02', 'CZ4', TRUE),  
('2015-04-03', 'ES1', TRUE), 
('2015-04-03', 'CZ4', TRUE); 

クエリ:

select q.rundate as gap_date,q.branch,
       (select max(tt.rundate) 
        from tbl tt
        where tt.rundate<q.rundate and tt.branch=q.branch)
        as real_date
from tbl t
right outer join(
         select rundate,branch from (
                select distinct rundate from tbl) t1
                cross join (
                select distinct branch from tbl)t2
          )q 
on t.rundate=q.rundate and t.branch=q.branch
where t.branch is null

結果:

gap_date    branch  real_date
2015-04-03  PL1     2015-04-02
于 2015-04-14T15:22:43.817 に答える
0

これは、実際に存在するレコードを除いcarthesian product of both domainsて@voycheck からの解決策です。

WITH br AS (
        SELECT DISTINCT branch AS branch FROM tbl
        )
, mima AS (
        SELECT MIN(rundate) as mi
             , MAX(rundate) as ma
        FROM tbl)
, rng AS (
        SELECT generate_series( mima.mi, mima.ma, '1 day'::interval)::date AS rundate
        FROM mima
        )
SELECT * FROM rng
JOIN br ON NOT EXISTS ( -- cartesian product EXCEPT
        SELECT *
        FROM tbl t
        WHERE t.branch = br.branch
        AND t.rundate = rng.rundate
        )
        ;
于 2015-04-14T16:24:50.750 に答える
0

あるセットですべての一意の日付を選択し、別のセットですべての一意のブランチを選択する必要があります-デカルト積を作成します-そして、どの組み合わせにギャップがあるかを確認できます...これが私が意味することです:

CREATE TEMPORARY TABLE _matrix
SELECT
t1.rundate,
t2.branch
(SELECT DISTINCT rundate FROM yourtable) t1,
(SELECT DISTINCT branch FROM yourtable) t2

次に、LEFT JOIN と "WHERE ... IS NULL" ステートメントを使用してギャップを見つけることができます。

SELECT
m.rundate,
m.branch
FROM _matrix m
LEFT JOIN yourtable yt ON(yt.rundate = m.rundate AND yt.branch = m.branch)
WHERE yt.rundate IS NULL

もちろん、一時テーブルがなくても、サブクエリだけを使用して同じことが実現できます。特にパフォーマンスが重要でない場合。

于 2015-04-14T14:49:17.110 に答える