Sql 选择另一列必须与两个特定选项之一匹配的位置

Sql 选择另一列必须与两个特定选项之一匹配的位置,sql,postgresql,Sql,Postgresql,我试图从单个表中的一列中获取值,其中另一列可以匹配两种情况中的一种 我的桌子看起来像: CREATE TABLE user_event ( id SERIAL Primary Key, session_id uuid NOT NULL, event_name text NOT NULL, event_value text NOT NULL ); -- Test Values INSERT INTO user_event(session_id, event_name, event

我试图从单个表中的一列中获取值,其中另一列可以匹配两种情况中的一种

我的桌子看起来像:

CREATE TABLE user_event (
  id SERIAL Primary Key,
  session_id uuid NOT NULL,
  event_name text NOT NULL,
  event_value text NOT NULL
);

-- Test Values
INSERT INTO user_event(session_id, event_name, event_value)
VALUES ('0971ad0b-0b98-4f09-bc93-9ae15c45941b', 'Heading.Click', 'test'),
('0971ad0b-0b98-4f09-bc93-9ae15c45941b', 'Subheading.Click', 'test'),
('0971ad0b-0b98-4f09-bc93-9ae15c45941b', 'Paragraph.Click', 'test'),
('6a627852-5f2a-4884-9949-cf11edf73628', 'Heading.Click', 'test'),
('1e5ec268-34ea-464a-82d1-2cf1e1425df3', 'Heading.Click', 'test'),
('1e5ec268-34ea-464a-82d1-2cf1e1425df3', 'Subheading.Click', 'test'), 
('1e5ec268-34ea-464a-82d1-2cf1e1425df3', 'Page.Impression', 'test');

-- Result
('0971ad0b-0b98-4f09-bc93-9ae15c45941b', '6a627852-5f2a-4884-9949-cf11edf73628')
我想要(伪sql):

到目前为止,我想出了一种效率极低的方法

SELECT session_id
FROM user_event
WHERE event_name = 'Heading.Click'
AND 
(session_id not in (select session_id from user_event where event_name != 'Heading.Click')
OR
(session_id in (select session_id from user_event where event_name = 'Subheading.Click')
AND session_id in (select session_id from user_event where event_name = 'Paragraph.Click')
));

这是一个小提琴设置,我一直在用它来测试这个

您可以将查询重写为

SELECT session_id
FROM user_event
GROUP BY session_id
HAVING 
    SUM(CASE WHEN event_name = 'Heading.Click' THEN 1 ELSE 0 END) >0
    AND (
        SUM(CASE WHEN event_name = 'Subheading.Click' THEN 1 ELSE 0 END) =0
        OR (
            SUM(CASE WHEN event_name = 'Subheading.Click' THEN 1 ELSE 0 END) > 0
            AND 
            SUM(CASE WHEN event_name = 'Paragraph.Click' THEN 1 ELSE 0 END) > 0
        ) 
    )
不需要子查询,您可以使用条件聚合来匹配每个会话id的条件


我认为这是行不通的。返回的
1e5ec268-34ea-464a-82d1-2cf1e1425df3
会话不包含
段落。单击
@Stephen My bad,我已更新查询查看更新的答案谢谢!“比我的尝试快多了。”戈登林诺夫,你确定吗?演示将返回正确的结果。@Stephen。没关系,这两个伪代码示例是不一致的。
SELECT session_id
FROM user_event
GROUP BY session_id
HAVING 
    SUM(CASE WHEN event_name = 'Heading.Click' THEN 1 ELSE 0 END) >0
    AND (
        SUM(CASE WHEN event_name = 'Subheading.Click' THEN 1 ELSE 0 END) =0
        OR (
            SUM(CASE WHEN event_name = 'Subheading.Click' THEN 1 ELSE 0 END) > 0
            AND 
            SUM(CASE WHEN event_name = 'Paragraph.Click' THEN 1 ELSE 0 END) > 0
        ) 
    )