【发布时间】:2013-09-17 19:01:42
【问题描述】:
我有这种情况:用户在网站上进行搜索,其中一些人购买了。在购买条件为真且搜索会话 = 购买会话
的情况下,您如何选择 18 岁以上进行了搜索而没有以下购买的用户这会选择具有搜索事件且年龄超过 18 岁的用户。
select DISTINCT ON (id) id, email, users.age, events.type, events.createdon
from users
LEFT JOIN events ON events.user = users.users
where events.type='search'
and age>18
and events.condition is true
如何添加他们之前在同一会话中进行过搜索事件的条件?
事件的表结构:
-----------------------------------------------------
| user | event | date | condition | session |
------------------------------------------------------|
| 1 | search | 08-10-2013 | true | A |
| 1 | search | 08-10-2013 | true | A |
| 2 | search | 08-10-2013 | false | B |
| 2 | purchase | 09-10-2013 | false | A |
| 2 | search | 09-10-2013 | true | C |
| 1 | purchase | 09-10-2013 | true | A |
| 3 | search | 09-10-2013 | false | D |
| 2 | search | 10-10-2013 | true | H |
| 4 | search | 10-10-2013 | false | E |
| 4 | search | 10-10-2013 | false | E |
| 3 | search | 11-10-2013 | true | D |
| 2 | other | 11-10-2013 | true | H |
| 1 | search | 11-10-2013 | true | F |
| 1 | purchase | 12-10-2013 | true | F |
| 3 | purchase | 12-10-2013 | false | D |
| 4 | search | 12-10-2013 | true | G |
| 2 | other | 12-10-2013 | true | A |
-----------------------------------------------------
而用户表是:
------------------------
| user | email | age |
------------------------
| 1 | a | 22 |
| 2 | b | 34 |
| 3 | c | 15 |
| 4 | d | 44 |
| 5 | e | 39 |
------------------------
结果应该是 2 和 4:
1 a -> NO because did purchase with condition=true
2 b -> YES because did search, did purchase BUT condition=false
3 c -> NO because did search, did purchase with condition=false BUT age<18
4 d -> YES because did search and no purchase
谢谢,我刚从 Mongo 开始使用 Postgres,而且好多了!
更新:例如更正的结果
【问题讨论】:
-
不相关,但是:使用
distinct on而不按顺序不是一个好主意。 -
能否添加预期结果?
-
是的,结果应该是 1 和 3。2 不正确,因为购买的看到与搜索中的会话不同
-
对不起,只有 1 个是正确的,因为 3 个年龄是 15 岁
-
您写道:
search without a following purchase,但在您的结果中,第一个用户在同一会话中有搜索和购买操作。对吗?
标签: sql postgresql