Tengo una tabla de eventos asociada con los usuarios. Me gustaría saber si es posible escribir una consulta sql, para seleccionar el usuario que crea el evento, y los últimos 3 eventos tenían el estado 'cancelado'.
no contar () donde estado = 'cancelado', solo donde las últimas 3 filas tenían estado cancelado
Select u.* from users AS u Right Join events as e ON e.user_id = u.id WHERE {last 3 rows have e.status = 'canceled'} Order by e.created_at Group by u.idTabla de EVENTOS:
user_id, status, created_at 1, 'canceled', 2017-04-21 1, 'finished', 2017-04-20 1, 'finished', 2017-04-19 1, 'canceled', 2017-04-18 1, 'canceled', 2017-04-17 2, 'canceled', 2017-04-21 2, 'canceled', 2017-04-20 2, 'canceled', 2017-04-19 2, 'finished', 2017-04-18 2, 'finished', 2017-04-17Puede obtener la lista de usuarios usando funciones de ventana. Aquí hay un método:
select e.user_id from (select e.*, row_number() over (partition by e.user_id order by created_at desc) as seqnum from event e ) e where seqnum <= 3 and e.status = 'canceled' group by e.user_id having count(*) = 3;La consulta enumera los eventos desde el final y luego cuenta el número que se cancela.
Puede obtener información adicional del usuario uniéndose nuevamente a users (o usando in o exists ).