SQL グループごとに上位数件ずつ取得したい への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 新人転職者  (社会人) 投稿日時 2021/10/8 18:25:42
別解までありがとうございます。

> 取得結果をウィンドウ関数で一旦集計してから、
> その集計結果に対して絞り込むわけですから。
ということは、rankが無効なる問題とは別に、全体の処理手順としても入れ子がいるということですかね

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/8 17:58:55
> URL先と同じ記述では「)に不適切な構文があります」と出でうまくいきません。
データベース製品によって、SQL 文法は微妙に異なります。
質問時には、どのデータベース製品を使っているかも記載しましょう。できればバージョンも。

たとえば、「)」の後に「AS bookOrder」などの別名が必要な DB があります。
あるいは、「) bookOrder」などのようにする DB (別名の前に AS と書けない) DB もあります。


> 入れ子?構造にする必要はないかと思い
必要ですよ。
取得結果をウィンドウ関数で一旦集計してから、
その集計結果に対して絞り込むわけですから。


副問い合わせを使う代わりに、WITH 句を使う手法もあります。
構文が変わっただけで、結果は一緒ですが。

WITH bookOrder AS (
  SELECT name, title, num
  , ROW_NUMBER() OVER (PARTITION BY name ORDER BY num DESC) AS rank
  FROM book
) SELECT * FROM bookOrder WHERE rank <= 5


データベースによっては、ROW_NUMBER ウィンドウ関数をサポートしない物や
WITH を使えないものもあります。ご利用中の製品の SQL リファレンスにてご確認ください。
投稿者 新人転職者  (社会人) 投稿日時 2021/10/8 17:03:34
https://qiita.com/ryota_i/items/8d0cc238c269fe9ca016
すいません。リンク先間違えました。こちらです。
投稿者 新人転職者  (社会人) 投稿日時 2021/10/8 17:01:02
https://qiita.com/gooddoog/items/e66818a1479e24fd413e
上記URLでの例のように
あるテーブルでグループごとに数件取得したいのですが、
URL先と同じ記述では「)に不適切な構文があります」と出でうまくいきません。
入れ子?構造にする必要はないかと思い下記のようにアレンジしたところ

 select
   name
  ,title
  ,num
  ,row_number() over (partition by name order by num desc) as rank
   from
   book
 where rank <= 5

「rankが無効です」と出てきてエラーになりました。どうやらSQLの処理順が関係しているらしく、select句のas rankより先にwhere 句のrankを通って定義前なのでエラーになるようです。

自分は実際にはrank=1で各グループの上位1件が並んだテーブルを取得したいのですが、どなたかご教授願います。