More than 3 years have passed since last update.
100日でSQLの達人になる@LeetCode! Day64 <3年連続してメダル獲得あるいは3回以上金メダル>
1
Posted at
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で解いています。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
