Eu quero selecionar cada primeiro e último evento de cada ID de usuário, se não existir nenhum primeiro evento, então apenas o último evento. tentei usar partition over , mas estou recebendo os primeiros 2 eventos.
Entrada:
id timestamp event
10096 1545136190 songs
10096 1545136202 tv
10096 1545136239 book
10096 1545136244 eat
10096 1545136252 travel
10096 1545136271 tv
10096 1545136275 laptop
10096 1545313396 sleep
10105 1545464444 book
10105 1545464455 eat
10105 1545464457 travel
10105 1545464460 tv
10105 1545464605 book
10105 1546740388 sleep
10213 1545134176 tv
10213 1545134180 computer
10213 1545134221 play
10213 1545134238 book
10213 1545134267 eat
10213 1545146190 travel
10213 1545146212 play
10213 1545623861 sleep
1053 1545131279 sleep
Saída esperada:
id timestamp event
10096 1545136190 songs
10096 1545313396 sleep
10105 1545464444 book
10105 1546740388 sleep
10213 1545134176 tv
10213 1545623861 sleep
1053 1545131279 sleep
tentei fazer isso, mas não obtendo exatamente o que eu quero:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY id ORDER BY id) as RowNum,
id,
timestamp,
event
FROM
`table`
) MyData
WHERE RowNum < 3
Aqui está uma maneira:
A ideia é ordenar cada id por timestamp em ordem crescente e decrescente e, em seguida, escolher o primeiro para cada ordenação.