Recentemente, fiz a mesma pergunta sobre o MySQL, que já foi migrado para o Postgres. Pergunta antiga .
Resumindo:
Eu tenho uma tabela com um id ( tipo UUID ), um timestamp e algum texto (row3). Como retenho apenas uma entrada por hora para cada valor distinto de row3?
O que eu tentei é isso:
INSERT INTO log_table
SELECT * FROM table1
WHERE id IN (
SELECT DISTINCT ON(id) id
FROM table1
GROUP BY row3, EXTRACT(HOUR FROM "time"), id
);
TRUNCATE table1;
Mas isso, infelizmente, insere todas as linhas da tabela1.
caso genérico
Digamos que você queira reter os valores pertencentes a
max(id)
cada hora e a cadarow3
valor distinto (mas consulte a seção UUID abaixo). Os IDs deles você obtém com uma consulta como(Isso irá omitir a data de seus dados, que é o que você pode querer - ou não. No último caso, você pode querer usar
date_trunc('hour', "time")
em seu lugar.)Em seguida, você pode usar a consulta acima para preencher uma tabela exatamente como fez na sua pergunta ou excluir todo o resto
table1
comoUUID
Não há
max()
para UUID. Portanto, outra solução é necessária no seu caso, como esta:Este aplica uma função de janela e o agrupamento é obtido pela
PARTITION BY
cláusula eDISTINCT
.(Agradecimento: obrigado pela ideia do AndriyM!)