私は次のように3つの大きなテーブルを持っています...
property
--------
property_id
other_prop_data
transfer_property
-----------------
property_id
transfer_id
transfer
--------
transfer_id
contract_date
transfer_price
'2012-01-01'と'2012-06-30'の間に発生したすべての転送の一意のプロパティIDのリストを返したいです。これが私がこれまでに持っているコードです...
SELECT *
FROM property p
JOIN
(
SELECT t.transfer_id, t.contract_date, t.transfer_price::integer, tp.property_id
FROM transfer t
LEFT JOIN transfer_property tp ON tp.transfer_id = t.transfer_id
WHERE t.contract_date BETWEEN '2012-01-01' AND '2012-06-30'
) transfer1 ON transfer1.property_id = p.property_id
AND NOT EXISTS
(
SELECT transfer2.transfer_id
FROM
(
SELECT t.transfer_id, t.contract_date, t.transfer_price::integer, tp.property_id
FROM transfer t
LEFT JOIN transfer_property tp ON tp.transfer_id = t.transfer_id
WHERE t.contract_date BETWEEN '2012-01-01' AND '2012-06-30'
) AS transfer2
WHERE transfer2.property_id = transfer1.property_id
AND transfer2.contract_date > transfer1.contract_date
)
これは(私が思うに)機能しますが、非常に遅いです。
私はいくつかの同様のクエリを見つけました... https://stackoverflow.com/questions/tagged/greatest-n-per-group ...しかし、私が見つけたもののほとんどは、リレーショナルに結合されたのではなく、同じテーブルとの自己結合でした上記のテーブル。
MySQLでユーザー変数を使用できることは知っていますが、PostgreSQLでこれを行う方法、またはこの場合の理想的なソリューションであるかどうかはわかりません。
このクエリを改善する方法(または上記の私の方法とはまったく異なる方法を使用してそれを行う方法)について誰かが何か提案がありますか?
どんな助けでも大歓迎です。ありがとう!
よろしく、
クリス
PS:DISTINCTとMAXのバリエーションも試しましたが、私が使用していた方法で最新の日付のレコードを選択しているとは確信していません。
編集:申し訳ありませんが、PGADMIN1.12.3でクエリを実行していることも追加する必要があります