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 如果一个条件不满足,则执行另一个条件