leet codeのSQL問題を1日1題解く【1581. Customer Who Visited but Did Not Make Any Transactions】
目次
初めに
今日もSQLの問題を解いて行きます。
問題
セットアップ
以下のSQL文をローカル環境で実行します。
Create table If Not Exists Visits(visit_id int, customer_id int); Create table If Not Exists Transactions(transaction_id int, visit_id int, amount int); Truncate table Visits; insert into Visits (visit_id, customer_id) values ('1', '23'); insert into Visits (visit_id, customer_id) values ('2', '9'); insert into Visits (visit_id, customer_id) values ('4', '30'); insert into Visits (visit_id, customer_id) values ('5', '54'); insert into Visits (visit_id, customer_id) values ('6', '96'); insert into Visits (visit_id, customer_id) values ('7', '54'); insert into Visits (visit_id, customer_id) values ('8', '54'); Truncate table Transactions; insert into Transactions (transaction_id, visit_id, amount) values ('2', '5', '310'); insert into Transactions (transaction_id, visit_id, amount) values ('3', '5', '300'); insert into Transactions (transaction_id, visit_id, amount) values ('9', '5', '200'); insert into Transactions (transaction_id, visit_id, amount) values ('12', '1', '910'); insert into Transactions (transaction_id, visit_id, amount) values ('13', '2', '970');
知らなかった or 理解があやふやな知識
COUNTとGROUP BYの併用
COUNTとGROUP BYを併用することで、グループごとのレコード数をカウントすることができます。
FROM > ON > JOIN > WHERE > GROUP BYの順番で評価される
WHEREがGROUP BYより上にあるのも、グループ化させるよりも前にWHEREの条件を適用させた方が、考慮すべき行数が減るので、WHEREの後にGROUP BYが実行されるのもなんとなく理解できます。
パフォーマンスや得られる結果を考慮すると、この順序になるのは自然なのかなと感覚で理解できます。
解答
こちらのSQLを実行したら、以下のような結果が取得できました。 LEFT OUTER JOINすることで、トランザクションを持っていない顧客も結合後のテーブルに表示させることができました。
SELECT * FROM Visits AS V LEFT OUTER JOIN Transactions AS T ON V.visit_id = T.visit_id
以下のSQL文を実行したら、無事クリアできました。
SELECT V.customer_id, COUNT(*) AS count_no_trans FROM Visits AS V LEFT OUTER JOIN Transactions AS T ON V.visit_id = T.visit_id WHERE T.transaction_id IS NULL GROUP BY V.customer_id
終わり
明日もやります!