Eu tenho duas tabelas table1
e table2
. Deixe as duas tabelas conterem a coluna de data, id e latência.
Tenho uma consulta simples que realiza um join nas duas tabelas e retorna um conjunto de linhas:
Select table1.date,(table2.latency - table1.latency) as ans from table1, table2
where table1.id = table2.id order by ans;
Preciso encontrar a linha do percentil n do conjunto de linhas retornado, digamos que preciso encontrar a linha do percentil 90%, 99% e 99,9% dos dados.
Eu preciso exibir os dados em um formulário como este:
date | percentile | ans
01-12-1995 | 90 | 0.001563
02-12-1999 | 99 | 0.0015
05-12-2000 | 99.9 | 0.012
Este é meu primeiro encontro com o PostgreSQL. Estou confuso sobre como devo proceder.
Eu estava dando uma olhada na PERCENT_RANK()
função. Por favor, me guie na direção correta.
Use a função window
ntile()
em uma subconsulta (requer Postgres 8.4 ou posterior).Em seguida, selecione os segmentos de seu interesse (correspondentes aos percentis) e escolha a linha com o menor valor:
O específico do Postgres
DISTINCT ON
é útil para a última etapa. Explicação detalhada nesta resposta relacionada em SO:Selecione a primeira linha em cada grupo GROUP BY?
Para obter o
90
,99
e o99.9
percentil, escolhi a granularidade correspondente comntile(1000)
. E adicionou um60
percentil de acordo com o comentário.Este algoritmo seleciona a linha no valor exato ou acima dele. Além disso, você pode adicionar uma linha à subconsulta
percent_rank()
para obter a classificação relativa exata da linha selecionada:À parte: substituí o nome da coluna
date
porthe_date
já que tenho o hábito de evitar palavras-chave SQL reservadas como identificadores, mesmo que o Postgres as permita.