Como o PostgreSQL pode retornar uma lista dos valores de carimbo de data/hora mais antigos em uma tabela de medições de identificação do sensor?
Deixe-me explicar a situação com uma tabela de exemplo:
CREATE TABLE sensor_data(
sensor_id INTEGER,
time TIMESTAMPTZ,
value NUMERIC,
PRIMARY KEY (sensor_id, time)
)
Exemplo de tabela preenchida:
+-----------+------------------+-------+
| sensor_id | time | value |
+-----------+------------------+-------+
| 1 | 2018-01-01 00:00 | 1 |
| 1 | 2018-01-01 01:00 | 2 |
| 3 | 2018-01-01 03:00 | 4 |
| 3 | 2018-01-01 04:00 | 3 |
| 4 | 2018-01-01 03:00 | 5 |
| 4 | 2018-01-01 04:00 | 6 |
+-----------+------------------+-------+
Ao usar algo como sensor_id (1,3) dentro da consulta, quero que ele retorne algo assim:
+-----------+------------------+-------+
| sensor_id | time | value |
+-----------+------------------+-------+
| 1 | 2018-01-01 01:00 | 2 |
| 3 | 2018-01-01 04:00 | 3 |
+-----------+------------------+-------+
Como posso fazer isso em uma consulta usando o PRIMARY KEY
índice para acelerá-la?
Existem muitos estilos de consulta possíveis, a maioria usará prontamente seu índice PK
(sensor_id, time)
conforme ele se encaixa na tarefa. (O Postgres pode ler índices de trás para frente praticamente tão rápido.) Isso deve ser quase perfeito:db<>fique aqui
LEFT JOIN .. ON true
mantém os sensores sem nenhuma entrada de dados no resultado - com valores NULL no lugar de valores.Relacionado:
Como você está no Postgres 11, um índice de cobertura pode pagar:
Mas torna o índice maior e grava na tabela mais caro, e seus nomes indicam uma tabela de gravação pesada. E enquanto você consulta apenas algumas linhas de cada vez, as consultas não ficam muito mais rápidas de qualquer maneira. Então provavelmente melhor do jeito que você tem. Relacionado:
Apenas para fins educacionais, aqui está outra maneira de resolvê-lo:
A desvantagem desta consulta é a necessidade de gerar consultas dinamicamente.
A solução de Erwin é muito mais apropriada nesse sentido.