我尝试过滤具有相同外来ID的行作为整个组。 (意思是WHERE col1 =' foo' AND col1 =' bar'将适用于整个组,并且只会返回外部ID,其中col1的行包含' foo&# 39;和' bar')
我有浏览量表。每个综合浏览量都包含其URL,并且是用户会话的一部分。我只需要过滤哪些网页浏览包含一些单词的会话。 假设我想过滤用户访问过的会话' / basket-step-1'和' / basket-finish'。 (它必须与否定一起工作,即访问过步骤1但没有访问完成)
我不能简单地在pageview.url上使用JOIN然后使用WHERE,因为一个网页浏览永远不能包含多个网址。
这样的事情在理论上会起作用:
SELECT * FROM session WHERE id IN
(
SELECT session_id FROM pageview
GROUP BY session_id
HAVING array_agg(url) ILIKE '%step-1%' AND ILIKE '%finish%'
)
但是,你不能在HAVING中使用ILIKE,而且可能会很慢。我现在的想法是如何创建此查询。
答案 0 :(得分:1)
您可以将having
与条件聚合一起使用:
select s.*
from session s
where s.id in (select session_id
from pageview pv
group by session_id
having sum(case when url ilike '%step-1%' then 1 else 0 end) > 0 and
sum(case when url ilike '%finish%' then 1 else 0 end) > 0
);
如果您想要否定,则只需使用= 0
代替> 0
。