1484. Group Sold Products By The Date (問題レベル: Easy)要課金
今日の問題はこれです。
日付毎に売れたアイテムの種類をカンマ区切りでリストアップし、そのアイテムの個数を取得するという問題。
'LeetCode Curated SQL 70'の'Easy'最終問題に選んだものです。
少し特殊な問題で、複数行データを一つの行にまとめてカンマ区切りにしないといけない。
また、同じアイテムを同じ日に購入した場合は、カウントしないというのも、なかなか厄介な条件。
これはMySQLでは'GROUP_CONCAT'という分かりやすいコマンド名で下記のように実現できるのだが、MS SQL Serverではこのコマンドは使えません。
SELECT sell_date, COUNT(DISTINCT product) AS num_sold,
GROUP_CONCAT(DISTINCT product ORDER BY product ASC) AS products
FROM activities
GROUP BY(sell_date)
調べると以前は、FOR XML PATH('')
を使うようですが、
MS SQL Server
の2017年版からは、STRING_AGG
コマンドが使えるようになっているみたいです。
ただ、MySQL
のGROUP_CONCAT
コマンドとは違って、このコマンド内でDISTINCT
が使えないために、
コマンドに入れる前に複数行を統合する処理が一手間かかる。
最終的に提出したコマンドは下記。
SELECT a.sell_date, COUNT(a.product) AS num_sold,
STRING_AGG(a.product, ',') WITHIN GROUP(ORDER BY product ASC) AS products
FROM (SELECT DISTINCT sell_date, product FROM activities) a
GROUP BY(sell_date)
まとめ。
今回のポイントはMS SQL Server
でMySQLのGROUP_CONCAT
と同様のことを実現したい場合はSTRING_AGG
を使う(ただし要注意)だった。
次回からはMedium
問題に挑戦します!
-
LeetCodeの問題は、
MS SQL Server
で解いています。