Redshift“对表的FROM子句条目的无效引用”

时间:2017-04-23 22:06:27

标签: amazon-web-services amazon-redshift

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连接不断失败。

1 个答案:

答案 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语句,它只会根据一行来计算答案。