SQL-来自另一个表的WHERE条件

时间:2018-12-05 14:38:02

标签: sql join left-join amazon-redshift

我必须研究客户每次会话在应用程序上购买商品的次数。所以我必须使用两个表。第一个(称为“ 会话”)的结构是这样的

user_id | session_id | start_session_time | end_session_time

第二个(称为“ 购买”)的结构如下:

user_id |时间戳| Purchase_id

其中user_id,session_id和Purchases_id是唯一的。

我的最终目标是要有一个表来统计用户在每个会话中购买了多少次。我想要的输出是:

user_id | session_id | start_session_time | end_session_time | nb_purchases

在我看来,这将是一个查询,例如:

SELECT sessions.user_id, sessions.session_id, sessions.start_time,
       sessions.end_time, count(purchases.purchase_id)
FROM sessions 
LEFT JOIN purchases 
    ON sessions.user_id = purchases.user_id
WHERE purchases.timestamp BETWEEN sessions.start_time AND sessions.end_time

有人可以帮我吗?

我正在使用SQL Amazon Redshift。

先谢谢您

安德里亚

2 个答案:

答案 0 :(得分:0)

您错过了添加GROUP BY的时间:

SELECT
    sessions.user_id
   ,sessions.session_id
   ,sessions.start_time
   ,sessions.end_time
   ,COUNT(purchases.purchase_id)
FROM sessions
LEFT JOIN purchases
    ON sessions.user_id = purchases.user_id
WHERE purchases.timestamp BETWEEN sessions.start_time AND sessions.end_time
GROUP BY
    sessions.user_id
   ,sessions.session_id
   ,sessions.start_time
   ,sessions.end_time

答案 1 :(得分:0)

您正在使用left join,因此该条件需要放在on子句中。然后,您还需要一个GROUP BY

SELECT s.user_id, s.session_id, s.start_time, s.end_time, count(p.purchase_id)
FROM sessions s LEFT JOIN
     purchases p
     ON s.user_id = p.user_id AND
        p.timestamp BETWEEN s.start_time AND s.end_time
GROUP BY s.user_id, s.session_id, s.start_time, s.end_time;