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

标签 sql postgresql

我正在尝试从单个表的一列中获取值,而另一列可以匹配两种情况之一。

我的 table 看起来像:

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 IS Heading.Click
AND other event_name's for the same session_id don't Contain Subheading.Click
OR 
event_name IS Heading.Click
AND other event_name's for the same session_id must contain both (Subheading.Click,
Paragraph.Click)

到目前为止,我想出了一个非常低效的方法

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')
));

这是我用来测试它的 fiddle 设置。 http://sqlfiddle.com/#!17/a55a3/1

最佳答案

您可以将查询重写为

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
        ) 
    )

不需要子查询,您可以使用条件聚合来匹配每个 session ID 的条件。

Demo

关于sql - 选择另一列必须匹配两个特定选项之一的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52741940/

相关文章:

mysql - 在数据库中排序整数

sql - 在 SQL Server 中将时间间隔转换为十进制小时数

select语句作为列的SQL性能

ruby-on-rails - 只查询组内最大值的记录

php - 如何从 php 或 postgresql 中的当前查询获取表名

postgresql - 如何在 postgresql 中修改列类型并设置其默认值和当前值

sql - 如何使用 Presto SQL 获取可重复的样本?

php - 移动到新服务器后无法写入 MYSQL DB

node.js - 如何将 postgreSQL 转换为 Sequelize 格式

postgresql - Postgis - 无法在 linux mint mate 17 上安装它