0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

100日でSQLの達人になる@LeetCode! Day23 <MySQLのGROUP_CONCATをMS SQL ServerのSTRING_AGGを使って実現する>

Posted at

1484. Group Sold Products By The Date (問題レベル: Easy)要課金

今日の問題はこれです。
日付毎に売れたアイテムの種類をカンマ区切りでリストアップし、そのアイテムの個数を取得するという問題。
'LeetCode Curated SQL 70'の'Easy'最終問題に選んだものです。
少し特殊な問題で、複数行データを一つの行にまとめてカンマ区切りにしないといけない。
また、同じアイテムを同じ日に購入した場合は、カウントしないというのも、なかなか厄介な条件。

これはMySQLでは'GROUP_CONCAT'という分かりやすいコマンド名で下記のように実現できるのだが、MS SQL Serverではこのコマンドは使えません。

MySQL
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コマンドが使えるようになっているみたいです。
ただ、MySQLGROUP_CONCATコマンドとは違って、このコマンド内でDISTINCTが使えないために、
コマンドに入れる前に複数行を統合する処理が一手間かかる。
最終的に提出したコマンドは下記。

MS SQL Server
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 ServerMySQLのGROUP_CONCATと同様のことを実現したい場合はSTRING_AGGを使う(ただし要注意)だった。
次回からはMedium問題に挑戦します!

  • LeetCodeの問題は、MS SQL Serverで解いています。
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?