代码之家  ›  专栏  ›  技术社区  ›  Stephen Gilboy

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

  •  1
  • Stephen Gilboy  · 技术社区  · 6 年前

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

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

    这是一个小提琴设置,我一直在用它来测试。 http://sqlfiddle.com/#!17/a55a3/1

    1 回复  |  直到 6 年前
        1
  •  2
  •   M Khalid Junaid    6 年前

    您可以将查询重写为

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

    Demo