同一IDが複数レコード含まれるデータセットの扱い方

はじめまして。株式会社オプテージの冲中です。

Datahubを活用させていただいているのですが、以下のような「同一IDが複数レコード含まれるデータセット」の扱い方を教えていただけないでしょうか。


user_id, option_service_id, option_start_date
aaa, service_1, 2019-01-22
bbb, service_1, 2019-04-23
bbb, service_2, 2019-08-02
ccc, service_2, 2019-01-02


具体的なイメージは以下です。
サイト来訪したユーザーが、現在どのオプションサービスを利用中か把握したいと考えています。
ただ、オプションサービス1契約単位のデータしか出力できないため、上記のようなデータセットしか出せません。
上記データセットをそのまま紐付けテーブルに移して紐付けると、「ID:bbb」の人は「契約中のサービス:service_1もしくはservice_2」のどちらかしか紐付かず、正しく把握できません。

そこで、以下のようなデータに変換する必要があるのかなとなんとなく思っています。


user_id, サービス1, サービス1利用開始日, サービス2, サービス2利用開始日
aaa, 1, 2019-01-22, ,
bbb, service_1, 2019-04-23, service_2, 2019-08-02
ccc, , , service_2, 2019-01-02


以上、アドバイスをお願いいたします!

紐付けテーブルはKeyがユニークである必要があるので、
いわゆる、SQLにおけるデータの縦持ち・横持ち問題を解決しなければなりません。

https://dev.classmethod.jp/articles/sql-data-horizontal-vertical/ (縦持ちのデータを横持ちに入れ替える)
SQLの書き方としては上記の記事が参考になりそうです。

ぜひトライしてみてください!

ありがとうございます!

いただいた参考ページと下記ページを見ながらやってみると意外と簡単にできました!

下記のクエリで

SELECT user_id,
max(CASE WHEN option_name = 'service_1' THEN option_start_date END) AS service_1,
max(CASE WHEN option_name = 'service_2' THEN option_start_date END) AS service_2,
FROM `dataset`
GROUP BY user_id
;

こんな感じになりました。

ID, service_1, service_2
aaa, 2019-01-22,
bbb, 2019-04-23, 2019-08-02
ccc, , 2019-01-02

1 Like