1811. Find Interview Candidates (問題レベル: Medium)要課金
今日の問題はこれ。
大会毎の金・銀・銅メダル取得者のIDが入ったテーブルから、3年連続して金銀銅メダルのいずれかを獲得したユーザーIDまたは、3回以上金メダルを獲得したユーザーIDをリストアップするという問題。
3回以上金メダルを獲得したユーザーIDの方はすぐに分かったのだが、3年連続してメダル獲得の方は少し悩んでしまった。
WITH
句でUNION ALL
を使って金銀銅を一つのIDにまとめて、IN()
を2つ使って異なる2つの条件をまとめてみました。なかなかややこしいですが、一つずつ分解して考えると自力で解けました。
最終的に提出した回答は下記。
ポイントはWITH
句とIN()
を使うとした。
SQL
WITH cte AS (
SELECT contest_id, gold_medal as id
FROM contests
UNION ALL
SELECT contest_id, silver_medal as id
FROM contests
UNION ALL
SELECT contest_id, bronze_medal as id
FROM contests
)
SELECT u.name, u.mail
FROM users u
WHERE
u.user_id IN (SELECT gold_medal FROM contests GROUP BY gold_medal HAVING COUNT(gold_medal) >= 3)
OR
u.user_id IN (SELECT DISTINCT a.id
FROM cte a
LEFT JOIN cte b
ON a.contest_id + 1 = b.contest_id
LEFT JOIN cte c
ON a.contest_id + 2 = c.contest_id
WHERE a.id = b.id AND a.id = c.id)
-
LeetCodeの問題は、
MS SQL Server
で解いています。