Abaixo está um exemplo de atividade diária da criança. Desejo selecionar as próximas linhas após a última atividade 'Reproduzir' com base no ID do usuário.
id timestamp activity
567 1541300537817000 Play
567 1541300584959000 Games
567 1541300711884001 Play
567 1541300749548000 Study
567 1541300804865000 Movie
678 1542073550481000 Computer
678 1542073551422000 Play
678 1542073551478000 Play
678 1542073561885000 Play
678 1542073567663000 Sleep
908 1543580126943000 Tv
908 1543580212409000 Sleep
908 1543580245227000 Play
Expected output
id timestamp activity
567 1541300749548000 Study
567 1541300804865000 Movie
678 1542073567663000 Sleep
Eu tentei fazer isso:
SELECT DISTINCT t1.*
FROM `table` t1, `table` t2
WHERE t1.id = t2.id
AND t1.timestamp > t2.timestamp
AND t2.activity = 'Play';
Mas está me dando eventos após a 1ª atividade do Play.
É possível resolver adicionando mais uma cópia de uma tabela para verificar se não há atividade 'Jogar' depois.
Mas é melhor usar uma subconsulta para selecionar a última atividade 'Play' e obter todos os registros depois dela:
Pesquise como fazer a primeira parte sem matar a performance. Ao fazer a segunda parte use-o com índices apropriados e provavelmente com tabelas temporárias criadas com triggers ou jobs. Por exemplo, um trabalho pode atualizar uma tabela muito menor com os resultados da tarefa 1. todas as noites.
Seus dados de amostra indicam que você deseja todas as atividades após o último
PLAY
porID
. Uma forma é pedir todas as atividades onde não exista uma brincadeira posteriormente: