SQL - 使用与组相同的外键过滤行

时间:2016-01-20 04:08:43

标签: sql postgresql

我尝试过滤具有相同外来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,而且可能会很慢。我现在的想法是如何创建此查询。

1 个答案:

答案 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