投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 リファレンスにてご確認ください。