1

編集-ピボット テーブルとは異なることがわかりました。私の場合、日付に基づいているため

リンクされたデータを持つテーブルがあります。データ マイニング用の一時的なデータのように、顧客ごとの最新のアクティビティを列に返したいと考えています。

したがって、テーブルに次の列があります。

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 |

私の考えはわかりましたか?申し訳ありませんが、明確に説明できない場合は、私の言いたいことを理解していただければ幸いです。

質問

  1. これらの問題に対する SQL クエリを作成するにはどうすればよいですか? (現在、MySQL データベースから RAW データを取得しています)
  2. この問題に対するより良いアプローチはありますか? それがベストプラクティスであることを願っています。
4

1 に答える 1