Tengo una mesa así:

user_id | event_id | action
--------+----------+--------
user_1  | 1        | view 
user_1  | 2        | enter
user_1  | 3        | sign_up
user_1  | 4        | view
user_2  | 1        | view
user_2  | 2        | sign_up
user_2  | 3        | enter
user_2  | 4        | view

Entonces, event_id está asociado con un usuario, siguiendo un orden cuando ocurrió el evento.

Lo que intentaba lograr aquí: quiero ver después de que los usuarios hicieron el evento 'sign_up', ¿qué más harían?

Necesito seleccionar todas las filas después de action = 'sign_up' por diferentes user_id.

La consulta que estaba probando y tenía problemas:

SELECT *
FROM TABLE
WHERE event_id >= (
  SELECT event_id
  FROM table
  WHERE action = 'sign_up'
  ORDER BY event_id ASC
  LIMIT 1
)

Esto simplemente eliminará event_id = 1 y se aplicará a todos los usuarios.

¿Alguna sugerencia?

Gracias

sql
1
user13464224 4 may. 2020 a las 12:09

2 respuestas

La mejor respuesta

Puede hacerlo simple y usar un enfoque de combinación:

SELECT t1.USER_ID, t1.EVENT_ID, t1.ACTION
FROM yourTable t1
INNER JOIN
(
    SELECT USER_ID, EVENT_ID
    FROM yourTable
    WHERE ACTION = 'sign_up'
) t2
    ON t1.USER_ID = t2.USER_ID AND
       t1.EVENT_ID > t2.EVENT_ID
ORDER BY t1.USER_ID, t1.EVENT_ID;

screen capture of demo below

Demo

La idea aquí es unirse a una subconsulta que encuentre, para cada usuario, el valor numérico exacto EVENT_ID en el que ocurrió el evento de registro. Luego, restringimos a las filas en su tabla original con la condición de que el evento ocurra después del registro. Tenga en cuenta que para los usuarios que nunca tuvieron un registro, ninguno de sus registros aparecerá en el conjunto de resultados.

0
Tim Biegeleisen 4 may. 2020 a las 09:21

Necesita una subconsulta correlacionada para que la subconsulta se evalúe para cada user_id por separado:

SELECT t1.*
FROM the_table t1
WHERE event_id >= (SELECT event_id 
                   from the_table t2
                   where t2.action = 'sign_up' 
                     and t2.user_id = t1.user_id
                   ORDER BY EVENT_ID ASC
                   limit 1 )
0
a_horse_with_no_name 4 may. 2020 a las 09:14