2017-04-24 25 views
0

これらのテーブルに特定のジオメトリがある場合、複数のテーブルから最大の日付を取得しようとしています。 マイテーブル多かれ少なかれ見ているような(もちろん、それらはすべて異なっているが、私はそれをより明確にするために、それらを短縮):複数テーブル結合の最大値を選択

テーブルタイプ:

Id, Info, Geometry, Date 

をそして最後に、私は他のを持っていますそのように見えるテーブル(再び短縮):

Bテーブル:今すぐ

Id, Geometry 

、私がやりたいことは、彼らジオメトリ上のすべての私のAタイプのテーブルを結合することですBテーブルのジオメトリと交差し、最新の日付を持つAテーブルを取得します。

私は現在働いている次のリクエストがあります。

UPDATE last_updateT SET date_last_update= S.dateMax 
FROM 
    (SELECT B.gid, MAX(A.last_date) AS dateMax 
    FROM B 
    JOIN A ON ST_Intersects(B.geometry, A.geometry) 
    GROUP BY B.gid) S 
WHERE T.id = S.gid; 

今、私は一種の私が聞いたテーブルAのように見える複数のテーブルに参加すること行うことができるようにしたいと思いを機能GREATESTしかし、私はそれを使用する方法についてはわかりません。 また、違いがある場合はPostgresqlを使用します。

答えて

1

あなたがUNION ALLを探しているので、それはからのデータであるかのようにあなたが別のテーブルからデータを扱うことができそうです1つの表のみ:

SELECT 
    b.gid, 
    MAX(x.last_date) AS dateMax 
FROM b 
JOIN 
(
    SELECT geometry, last_date FROM a 
    UNION ALL 
    SELECT geometry, last_date FROM aa 
    UNION ALL 
    SELECT geometry, last_date FROM aaa 
) x ON ST_Intersects(b.geometry, x.geometry) 
GROUP BY b.gid; 
+0

ありがとうまさに私が必要としていたようです。私のAタイプのテーブルが非常に重い場合、1つの小さな質問しかし、それを行うための最も適切な方法ですか? (いくつかの行の何百万行) – Asew

+1

はい、アプローチは大丈夫です。あなたの主な問題はとにかく、関数と交差する行しか見つからないので、テーブル全体を読み取る必要があります。この場合、 'UNION ALL'はここでうまく動作し、これを遅らせるべきではありません。 –

0

広いストロークの場合、MAXは集約関数であるため、MAXを使用して、複数の異なる列にわたって同じ列から最高の値を取得します。

GREATESTはスカラー関数で、GREATESTを使用して同じ行の異なる列から最高の値を取得します。

例:

SELECT GREATEST(col1,col2,col3) 

グレイテスト:https://www.postgresql.org/docs/9.5/static/functions-conditional.html

最大:https://www.postgresql.org/docs/9.5/static/functions-aggregate.html

関連する問題