1341. Movie Rating (問題レベル: Medium)要課金
今日の問題はこれ。
最も多くの映画にratingを投票しているユーザー名と最も平均レビュー点数が高い映画をリストアップするという問題。
全く異なる変数をリストアップする問題のためUNION
を使うことはすぐに分かりました。
また、一人だけ、一本だけリストするためにSELECT TOP1 変数名
もすぐに分かりました。
ユーザー名だけ、映画名だけをリストするのはすぐに出来ましたが、UNION
でエラーが出てしまう。
調べるとMS SQL Server
(だけではない!?)ではGROUP BY
とUNION
を一緒に使う時にはエラーがおきるようだ。
つまり、これでは駄目で(注:説明のため、簡略化して記載するためにこの問題の回答とは異なります)
MS SQL Server
SELECT TOP 1 mr.user_id AS result
FROM movierating mr
GROUP BY mr.user_id
ORDER BY count(*), mr.user_id ASC
UNION
SELECT TOP 1 mr.movie_id AS result
FROM movierating mr
GROUP BY mr.movie_id
ORDER BY count(*), mr.movie_id ASC
MS SQL Server
SELECT t1.user_id AS result
FROM (
SELECT TOP 1 mr.user_id
FROM movierating mr
GROUP BY mr.user_id
ORDER BY COUNT(*), mr.user_id ASC
) t1
UNION
SELECT t2.movie_id AS result
FROM (
SELECT TOP 1 mr.movie_id
FROM movierating mr
GROUP BY mr.movie_id
ORDER BY COUNT(*), mr.movie_id ASC
) t2
のように一旦テーブルの中でGROUP BY
, ORDER BY
をした結果をSELECT
文でもう一度取り出す形になる。
今日のポイントはGROUP BY
とUNION
を一緒に使う時には注意が必要!
-
LeetCodeの問題は、
MS SQL Server
で解いています。