SQL グループごとに上位数件ずつ取得したい への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2021/10/8 17:58:55
> URL先と同じ記述では「)に不適切な構文があります」と出でうまくいきません。
データベース製品によって、SQL 文法は微妙に異なります。
質問時には、どのデータベース製品を使っているかも記載しましょう。できればバージョンも。
たとえば、「)」の後に「AS bookOrder」などの別名が必要な DB があります。
あるいは、「) bookOrder」などのようにする DB (別名の前に AS と書けない) DB もあります。
> 入れ子?構造にする必要はないかと思い
必要ですよ。
取得結果をウィンドウ関数で一旦集計してから、
その集計結果に対して絞り込むわけですから。
副問い合わせを使う代わりに、WITH 句を使う手法もあります。
構文が変わっただけで、結果は一緒ですが。
データベースによっては、ROW_NUMBER ウィンドウ関数をサポートしない物や
WITH を使えないものもあります。ご利用中の製品の SQL リファレンスにてご確認ください。
データベース製品によって、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件が並んだテーブルを取得したいのですが、どなたかご教授願います。
上記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件が並んだテーブルを取得したいのですが、どなたかご教授願います。
> 取得結果をウィンドウ関数で一旦集計してから、
> その集計結果に対して絞り込むわけですから。
ということは、rankが無効なる問題とは別に、全体の処理手順としても入れ子がいるということですかね