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

Posted

技术标签:

【中文标题】SQL - 来自另一个表的 WHERE 条件【英文标题】:SQL - WHERE condition from another table 【发布时间】:2018-12-05 14:38:02 【问题描述】:

我必须研究客户每次会话在应用上购买商品的次数。所以我必须使用两张桌子。第一个(称为“sessions”)就是这样构成的

user_id | session_id |开始会话时间 | end_session_time

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

user_id |时间戳 | purchase_id

其中 user_id、session_id 和 purchase_id 是唯一的。

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

user_id | session_id |开始会话时间 | 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。

提前谢谢你,

安德烈亚

【问题讨论】:

添加一些示例表数据和预期结果。 (请格式化文本,而不是图像。) 您需要Group By user_id, session_id 才能获得每个用户每个会话的正确购买计数,然后根据时间戳查询。此外,这似乎是一个 db 架构设计缺陷,因为只需将 session_id 添加到购买表即可通过简单的查询为您提供所需的内容。 那么什么不适合你?你定义了一个故事,但说没有问题;没有定义错误与预期错误。 【参考方案1】:

您使用的是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;

【讨论】:

【参考方案2】:

你错过了添加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

【讨论】:

以上是关于SQL - 来自另一个表的 WHERE 条件的主要内容,如果未能解决你的问题,请参考以下文章

插入表需要来自另一个表的特定条件

SQL Server 是不是在复杂视图中传播 WHERE 条件?

SQL 语句 join where 如果一个条件不满足,则执行另一个条件

具有另一个 sql 语句的 where 子句中的 case 条件

Case when 条件下来自另一个表的子查询

关于 select的条件语句where 后能否内嵌另一个 select语句??