1077. Project Employees III (問題レベル: Medium)要課金
今日の問題はこれ。
プロジェクト毎に最も経験数が長い職員IDをリストアップするという問題。
試行錯誤したが何とか自力で解けました。
今回の問題は、到達すべき目的はシンプルなのですが、テーブルが複数に分かれているためになかなかクエリが書きづらい。
そこで今まであまり使ってこなかったWITH
句でもともとテーブルが一つにまとまっていたら・・・と考えてみるとスッキリ解けました。
SQL
WITH CTE AS (
SELECT p.project_id, p.employee_id, e.experience_years
FROM project p
LEFT JOIN employee e
ON p.employee_id=e.employee_id)
-- ここまでで情報が別れて存在していたのが一つのテーブルにまとまった理想のテーブルが出来ました
-- 後は割とシンプル
SELECT a.project_id, a.employee_id
FROM CTE a
JOIN
(SELECT project_id, MAX(experience_years) AS max
FROM CTE
GROUP BY project_id) b
ON a.project_id=b.project_id AND a.experience_years=b.max
MYSQL
だと複数条件でIN
句が使える(実際Discuss
内のMYSQL
の解答例ではこれが多かった)のですがMS SQL Server
では一つしか条件が使えないためにこの解法を選択しました。
今日のポイントは複数テーブルに情報が別れている場合はWITH
句でまとめてスッキリ!としました。
中級問題も残すところ後3問。
-
LeetCodeの問題は、
MS SQL Server
で解いています。