web-dev-qa-db-ja.com

OVER(PARTITION BY)を使用してパーティション内の結果の数を制限する

次のクエリで、サブクエリfooの外側でWHERE foo.row_num < 3句を使用して各パーティションから返される結果を制限する必要があるのに、WHERE row_num < 3のサブクエリ内からではないのはなぜですか?

クエリ

SELECT pid, land_type, row_num, road_name, round(CAST(dist_km AS numeric), 2) AS dist_km

FROM (
    SELECT ROW_NUMBER() 
    OVER (
        PARTITION by loc.pid
        ORDER BY ST_Distance(r.the_geom, loc.the_geom)
    ) as row_num,
    loc.pid, loc.land_type, r.road_name, 
    ST_Distance(r.the_geom, loc.the_geom)/1000 as dist_km
    FROM ch05.land AS loc
    LEFT JOIN ch05.road AS r
    ON ST_DWithin(r.the_geom, loc.the_geom, 1000)
    WHERE loc.land_type = 'police station'
) AS foo

WHERE foo.row_num < 3
ORDER BY pid, row_num;

機能しないクエリ

SELECT pid, land_type, row_num, road_name, round(CAST(dist_km AS numeric), 2) AS dist_km

FROM (
    SELECT ROW_NUMBER() 
    OVER (
        PARTITION by loc.pid
        ORDER BY ST_Distance(r.the_geom, loc.the_geom)
    ) as row_num,
    loc.pid, loc.land_type, r.road_name, 
    ST_Distance(r.the_geom, loc.the_geom)/1000 as dist_km
    FROM ch05.land AS loc
    LEFT JOIN ch05.road AS r
    ON ST_DWithin(r.the_geom, loc.the_geom, 1000)
    WHERE loc.land_type = 'police station'
    AND row_num < 3
) AS foo

ORDER BY pid, row_num;

エラー:ERROR: column "row_num" does not exist

6
Nyxynyx

列 "row_num"は存在しません。処理の論理的な順序は、dbmsがSELECT句を評価する前にWHERE句を適用する必要があるためです。ウィンドウ関数はSELECT句の一部であるため、同じステートメントのWHERE句ではエイリアスにアクセスできません。

FROM句は、評価されるステートメントの最初の部分です。そのため、FROM句で宣言したエイリアスは、同じステートメントのWHERE句でアクセスできます

検索 このページ 「論理処理順序」。これはSQL Serverのドキュメントにリンクしていますが、処理の論理的な順序は、SQL標準に準拠するすべてのdbmsで同じです。