LoginSignup
1
0

More than 1 year has passed since last update.

100日でSQLの達人になる@LeetCode! Day64 <3年連続してメダル獲得あるいは3回以上金メダル>

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で解いています。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0