Search code examples
sqlgoogle-bigquerylegacy-sql

Count number of events before and after a particular event in SQL?


I have a table containing date and events. There is event named 'A'. I want to find out how many events occurred before and after event 'A' in Sql Bigquery. for Example,

User           Date             Events
123          2018-02-13            D
123          2018-02-12            B
123          2018-02-10            C
123          2018-02-11            A
123          2018-02-01            X

The answer would be something like this.

  User       Event    Before   After
  123          A       2        2

I have tried many queries but its not working. Any Idea, how to solve this problem?


Solution

  • below is for BigQuery Standard SQL

    #standardSQL
    WITH `project.dataset.events` AS (
      SELECT 123 user, '2018-02-13' dt, 'D' event UNION ALL
      SELECT 123, '2018-02-12', 'B' UNION ALL
      SELECT 123, '2018-02-11', 'A' UNION ALL
      SELECT 123, '2018-02-10', 'C' UNION ALL
      SELECT 123, '2018-02-01', 'X' 
    )
    SELECT user, event, before, after 
    FROM (
      SELECT user, event, 
        COUNT(1) OVER(PARTITION BY user ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) before,
        COUNT(1) OVER(PARTITION BY user ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) after
      FROM `project.dataset.events`
    )
    WHERE event = 'A'