【问题标题】:who visited the room谁参观了房间
【发布时间】:2016-11-11 14:27:19
【问题描述】:

我有一张带有useridroomidtimestamp 字段的表格。

每个房间可能有不同的userIds:

 userId1 roomid1 12:15:17
 userId1 roomid1 12:17:15
 userId2 roomid1 13:17:15 
 userId3 roomid2 12:15:15
 userId4 roomid2 12:15:18
 userId5 roomid2 12:15:25

我需要一个返回如下内容的查询:

  roomid            1           2           3        4           5
  roomid1      userid1       userid2     userid3
  roomid2      userid4       userid5     userid6   userid7    userid8

所以我可以看到在整个游戏过程中哪些不同的用户访问了哪些不同的房间。

房间里最多可以有 32 个用户。

【问题讨论】:

  • 您使用的是哪个 dbms?
  • RDBMS 在这里很重要...但是您需要一个“动态支点”(SQL SERVER example 或具有最大分组的 32 个 case 语句。(mySQL case example)
  • 这些事情在某些 RDBMS 中是可能的,但在我看来,如果你有一个,最好在客户端执行此操作

标签: sql transformation rank


【解决方案1】:

使用PIVOT

SELECT roomid, [userId1] AS userId1, [userId2] AS userId2, [userId3] AS userId3, [userId4] AS userId4, [userId5] AS userId5
FROM (SELECT timestamp, userid, roomid
      FROM yourtable) a
PIVOT
(COUNT (timestamp) 
 FOR userid IN ([userId1], [userId2], [userId3], [userId4], [userId5])
) AS b
ORDER BY b.roomid;

输出:

roomid  userId1 userId2 userId3 userId4 userId5
roomid1 2       1       0       0       0
roomid2 0       0       1       1       1

SQL 小提琴:http://sqlfiddle.com/#!3/7df741/1/0

【讨论】:

  • 我有大约 500 个用户 ID,我如何在不指定每个用户 ID 的情况下做到这一点。我也不需要他去过房间多少次,所以它应该看起来像 roomid 1 2 3 4 5 roomid1 userid1 userid2 userid3 roomid2 userid4 userid5 userid6 userid7 userid8
  • 如上,使用动态数据透视,或全部指定。
  • 查看描述示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多