SQL window function with a where clause?

前端 未结 2 1890
别跟我提以往
别跟我提以往 2021-02-12 17:50

I\'m trying to correlate two types of events for users. I want to see all event \"B\"s along with the most recent event \"A\" for that user prior to the \"A\" event. How would

相关标签:
2条回答
  • 2021-02-12 18:14

    Just tried Gordon's approach using PostgreSQL 9.5.4, and it complained that

    FILTER is not implemented for non-aggregate window functions

    which means using lag() with FILTER is not allowed. So I modified Gordon's query using max(), a different window frame, and CTE:

    WITH subq AS (
      SELECT
        "user", event, time as event_b_time,
        max(time) FILTER (WHERE event = 'A') OVER (
          PARTITION BY "user"
          ORDER BY time
          ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
        ) AS last_event_a_time
      FROM events
      ORDER BY time
    )
    SELECT
      "user", event_b_time, last_event_a_time
    FROM subq
    WHERE event = 'B';
    

    Verified that this works with PostgreSQL 9.5.4.

    Thanks to Gordon for the FILTER trick!

    0 讨论(0)
  • 2021-02-12 18:34

    There is not need for window functions here. Just find all B events, and for each one of them, find the most recent A of the same user via a subquery. Something like that should do it:

    SELECT
        "user",
        time AS event_b_time,
        (SELECT time AS last_event_a_time
         FROM t t1
         WHERE "user"=t.user AND event='A' AND time<t.time
         ORDER BY time DESC LIMIT 1)
    FROM t
    WHERE event='B';
    

    I assume that the table is called t (I used it twice).

    0 讨论(0)
提交回复
热议问题