2016-01-20 26 views
0

我试图过滤具有与整个组相同的外部ID的行。 (意思是说,col1 ='foo'和col1 ='bar'将适用于整个组,并且只会返回col1具有'foo'和'bar'的行的外部ID)SQL - 使用与组相同的外键过滤行

我有表与综合浏览量。每个综合浏览量都包含其网址,并且是用户会话的一部分。我只需要过滤仅包含一些字词的浏览量的会话。 假设我想过滤用户访问'/ basket-step-1'和'/ basket-finish'的会话。 (它也必须与否定,即访问步骤1,但没有访问完成)

我不能简单地使用JOIN,然后WHERE在pageview.url因为一个pageview永远不能包含多个网址。

像这样在理论上将工作:

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

您可以使用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

+0

多么不直观的解决方案!谢谢。 –