SELECT a.user_id, a.event_type AS e1, b.event_type
AS e2, c.event_type AS e3, d.experiments as Experiment
FROM (SELECT * FROM next3 WHERE row_number=1) AS a
JOIN (SELECT * FROM next3 WHERE row_number=2) AS b
ON a.user_id = b.user_id
JOIN (SELECT * FROM next3 WHERE row_number=3) AS c
ON a.user_id = c.user_id
JOIN (SELECT experiments from new_users) as d
on new_users.user_id=c.user_id
NEW_USERS
user_id :platform :experiment
19201098735 :web :
19203549751 :web :gh|ntn
Next3
user_id :event_type :row_number
19201098735:NewUser :1
19201098735:AboutUsViewed :2
19201098735:HomeViewed :3
19203549751:NewUser :1
19203549751:HomeViewed :2
19203549751:SessionAuthenticated:3
期望的结果:
user_id :E1 :E2 :E3 :Experiment
19201098735 :NewUser:AboutUsViewed :HomeViewed :
19203549751 :NewUser:HomeViewed :SessionAuthenticated :gh|ntn
我已经运行了很多方法 - 请注意我是一名分析师,他试图处理数据而不是构建系统的经理,所以不是最好的SQL编码器。 有一个关于所有事件的观点,我已经下载到那些有资格看到实验的人,然后撤回所有事件。然后我想将3行事件转换为3列,并添加实验,将其视为新的第4列。这是new_Users连接不断失败。
答案 0 :(得分:0)
使用此:
SELECT
user_id,
MIN(CASE WHEN row_number = 1 THEN event_type END) as E1,
MIN(CASE WHEN row_number = 2 THEN event_type END) as E2,
MIN(CASE WHEN row_number = 3 THEN event_type END) as E3,
Experiment
FROM New_Users, Next3
GROUP BY user_id, experiment
ORDER BY user_id
说明:
GROUP BY
表示您希望每个用户使用一行New_Users
中的每一行都与Next3
中的每一行相连。这意味着现在有很多行被选中!例如,100个用户x 3行= 300行。但不要惊慌! GROUP BY
会将其减少到每个用户一行。CASE
语句可能看起来令人困惑,但它基本上是说“嘿,在这个用户的所有行中,查看row_number = 1
的那些行,然后找到MIN
(最小值) )该集合中的值,并返回它。如果row_number不是1,则忽略它。“将数据从多行减少到一行是一个巧妙的技巧。 MIN
函数可以是任何函数(SUM,AVG,MAX) - 您只需要输出一个值即可。这就像使用SUM(price)
来获取单个值一样,但结合CASE
语句,它只会根据一行来计算答案。