LoginSignup
2
0

More than 1 year has passed since last update.

100日でSQLの達人になる@LeetCode! Day41 <WITH句ですっきり>

Posted at

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

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
2
0