編集-ピボット テーブルとは異なることがわかりました。私の場合、日付に基づいているため
リンクされたデータを持つテーブルがあります。データ マイニング用の一時的なデータのように、顧客ごとの最新のアクティビティを列に返したいと考えています。
したがって、テーブルに次の列があります。
id_user | item_id | date
1 | 2 | 2016-11-10
1 | 3 | 2016-9-9
1 | 23 | 2016-8-8
1 | 21 | 2016-6-6
1 | 5 | 2016-7-7
1 | 4 | 2016-10-10
2 | 3 | 2016-9-9
2 | 4 | 2016-10-10
2 | 21 | 2016-5-4
3 | 4 | 2016-10-10
3 | 4 | 2016-9-9
まず、データをフィルタリングして「最近の 5」アクティビティを取得したいと考えています。次に、このコードを思いつきます
set @num := 0, @group := '';
select x.`id_user`, x.`item_id`, x.`date`
from
(
select `id_user`, `item_id`, `date`,
@num := if(@group = `id_user`, @num + 1, 1) as row_number,
@group := `id_user` as dummy
from ratings
order by `id_user`, `date` desc, `item_id`
) as x,
where x.row_number <= 5
ORDER BY x.`user_id`, x.date DESC;
これらのコードは私にこの表を与えます:
id_user | item_id | date
1 | 2 | 2016-11-10
1 | 4 | 2016-10-10
1 | 3 | 2016-9-9
1 | 23 | 2016-8-8
1 | 5 | 2016-7-7
2 | 4 | 2016-10-10
2 | 3 | 2016-9-9
2 | 21 | 2016-5-4
3 | 4 | 2016-10-10
3 | 4 | 2016-9-9
しかし- 私はデータマイニングの目的のためにこのようなものが欲しい
Id_user | item_1 | Item_2 | Item_3 | Item_4 | Item_5
1 | 2 | 4 | 3 | 23 | 5 |
2 | 4 | 3 | 21 | NULL | NULL |
3 | 4 | 4 | NULL | NULL | NULL |
私の考えはわかりましたか?申し訳ありませんが、明確に説明できない場合は、私の言いたいことを理解していただければ幸いです。
質問
- これらの問題に対する SQL クエリを作成するにはどうすればよいですか? (現在、MySQL データベースから RAW データを取得しています)
- この問題に対するより良いアプローチはありますか? それがベストプラクティスであることを願っています。