2017-11-02 4 views
0

私は非常にユニークなレコード一致問題を現在のpostgresで処理しています。基本的には、私は一致する必要があるキー値とレコードの日付を含む、多くのレコードを含むテーブル(A)を持っています。次に、私はこのキー値の最初のテーブルと一致させたいこの他のテーブル(B)を持っています。ただし、両方のテーブルに同じ「キー値」が複数存在する可能性があります。これを回避するには、テーブルAからの最も早いキー値をテーブルBの最も早いキー値に合わせる必要があります。2番目に早いキー値を2番目に早い順に並べ替えるなどです。ただし、テーブルBのキー値が一致しない場合テーブルBの場合は、既に他のものがすでに一致していても、Aの最新のキー値一致にデフォルト設定したいと考えています。Postgres:キー値と各テーブルの最古の日付に基づいて2つのテーブルのレコードを一致させる必要があります

ROW_NUMBER() OVER (PARTITION BY key_value ORDER BY date) AS rank 

そしてランクとKEY_VALUE分野に参加する:

私の最初に考えたのは、両方のテーブルの上にこのようなものを使用することです。しかし、私はこの方法で動作するようにデフォルトのシナリオをどのように取得するのか正確にはわかりません。レコードが一方のテーブルに追加され、他方のテーブルに追加されずに再び結合を試みると、同期が外れる可能性があります。

私の他の考えは、カーソルを使用することでしたが、私はそれを実装する方法を見て本当に苦労しています。

ご協力いただければ幸いです!

答えて

0

まず、すべての行に番号を付ける必要があります。一致するランクのものを探します。その試合後

これは素晴らしいですLATEST_DATE

with cteA as (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY key_value ORDER BY date) AS rank 
    FROM tableA 
), cteB as (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY key_value ORDER BY date) AS rank 
    FROM tableB 
), ranked_match as (
    SELECT ctA.*, cteB.* 
    FROM cteA 
    LEFT JOIN cteB 
     ON cteA.key_value = cteB.key_value 
    AND cteA.rank = cteB.rank 
), latest_row as (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY key_value ORDER BY date DESC) AS rank 
    FROM tableB 
) 
SELECT * 
FROM ranked_match 
WHERE cteB.key_value IS NOT NULL 

UNION ALL 

SELECT * 
FROM ranked_match 
JOIN latest_row 
    ON ranked_match.key_value = latest_row .key_value 
WHERE cteB.key_value IS NULL 
    AND latest_row .rank = 1 
+0

に一致せず一つは、あなたに感謝!すぐに実装しようとしています – eosos

関連する問題