2

なぜ次のクエリを行うのですか:

select ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY time DESC) as rownum FROM users where rownum < 20;

次のエラーが発生しますか?

ERROR: column "rownum" does not exist LINE 1: ...d ORDER BY time DESC) as rownum FROM users where rownum < 2...

ウィンドウ関数で定義されているように、最初の 20 項目を取得するように、このクエリをどのように構成すればよいでしょうか?

user_idtimeは両方とも で定義された列usersです。

4

2 に答える 2

6

次のように機能します。

SELECT *
FROM  (
   SELECT ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY time DESC) AS rownum
   FROM   users
   ) x
WHERE  rownum < 20;

ここでのポイントは、一連のイベントです。ウィンドウ関数はWHERE句の後に適用されます。したがってrownum、まだ表示されません。それをサブクエリまたは CTE に入れて、次のクエリ レベルでWHERE句を適用する必要があります。rownum

ドキュメントごと

ウィンドウ関数は、クエリのSELECTリストとORDER BY 句でのみ使用できます。GROUP BY、 節など、他の場所では禁止されていますHAVINGWHEREこれは、これらの句の処理後に論理的に実行されるためです。また、ウィンドウ関数は通常の集計関数の後に実行されます。つまり、ウィンドウ関数の引数に集計関数呼び出しを含めることは有効ですが、その逆は有効ではありません。

于 2013-02-23T01:18:09.757 に答える
1

句は選択の前に実行されるため、whereそのエイリアスについてはまだ認識されていません。次のようにします。

select *
from (
    select ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY time DESC) as rownum 
    FROM users 
) s
where rownum < 20;
于 2013-02-23T01:19:04.557 に答える