Função PERCENTILE_CONT
PERCENTILE_CONT é uma função de distribuição inversa que assume um modelo de distribuição contínua. Ela pega um valor percentil e uma especificação de classificação e retorna um valor intercalar que cairia dentro do valor percentil fornecido em relação à especificação de classificação.
PERCENTILE_CONT computa uma interpolação linear entre valores após ordená-los. Usando o valor percentil (P)
e o número de linhas não nulas (N)
no grupo de agregação, a função computa o número da linha após ordenar as linhas de acordo com a especificação de classificação. Esse número de linha (RN)
é computado de acordo com a fórmula RN = (1+ (P*(N-1))
. O resultado final da função agregada é computado por interpolação linear entre os valores das linhas nos números de linha CRN = CEILING(RN)
e FRN = FLOOR(RN)
.
O resultado final será o seguinte.
Se (CRN = FRN = RN)
, o resultado é (value of expression from row at
RN)
Caso contrário, o resultado é o seguinte:
(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression
for row at CRN)
.
PERCENTILE_CONT é uma função de nós de computação apenas. A função retornará um erro se a consulta não fizer referência a uma tabela definida pelo usuário ou a uma tabela do sistema AWS Clean Rooms.
Sintaxe
PERCENTILE_CONT ( percentile ) WITHIN GROUP (ORDER BY expr)
Argumentos
- percentil
-
Constante numérica entre 0 e 1. Nulls são ignorados no cálculo.
- WITHIN GROUP ( ORDER BY expr)
-
Especifica valores numéricos ou de data/hora para classificação e computação do percentil.
Retornos
O tipo de retorno é determinado pelo tipo de dados da expressão ORDER BY na cláusula WITHIN GROUP. A tabela a seguir mostra o tipo de retorno para cada tipo de dados da expressão ORDER BY.
Tipo de entrada | Tipo de retorno |
---|---|
SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL | DECIMAL |
FLOAT, DOUBLE | DOUBLE |
DATA | DATA |
TIMESTAMP | TIMESTAMP |
TIMESTAMPTZ | TIMESTAMPTZ |
Observações de uso
Se a expressão ORDER BY é um tipo de dados DECIMAL com a precisão máxima de 38 dígitos, é possível que PERCENTILE_CONT retorne um resultado impreciso ou um erro. Se o valor de retorno da função PERCENTILE_CONT excede 38 dígitos, o resultado é truncado, o que causa a perda de precisão. Se, durante a interpolação, um resultado intermediário excede a precisão máxima, um excedente numérico ocorre e função retorna um erro. Para evitar essas condições, recomendamos o uso de um tipo de dados com menor precisão ou a conversão da expressão ORDER BY para uma precisão mais baixa.
Se uma instrução inclui várias chamadas para funções agregadas baseadas em classificação (LISTAGG, PERCENTILE_CONT ou MEDIAN), todas devem usar os mesmos valores ORDER BY. Observe que MEDIAN aplica um order by implícito no valor da expressão.
Por exemplo, a seguinte instrução retorna um erro.
select top 10 salesid, sum(pricepaid), percentile_cont(0.6) within group (order by salesid), median (pricepaid) from sales group by salesid, pricepaid; An error occurred when executing the SQL command: select top 10 salesid, sum(pricepaid), percentile_cont(0.6) within group (order by salesid), median (pricepaid) from sales group by salesid, pricepai... ERROR: within group ORDER BY clauses for aggregate functions must be the same
A instrução a seguir é executada com êxito.
select top 10 salesid, sum(pricepaid), percentile_cont(0.6) within group (order by salesid), median (salesid) from sales group by salesid, pricepaid;
Exemplos
O seguinte exemplo mostra que MEDIAN produz os mesmos resultados que PERCENTILE_CONT(0,5).
select top 10 distinct sellerid, qtysold, percentile_cont(0.5) within group (order by qtysold), median (qtysold) from sales group by sellerid, qtysold; sellerid | qtysold | percentile_cont | median ---------+---------+-----------------+------- 1 | 1 | 1.0 | 1.0 2 | 3 | 3.0 | 3.0 5 | 2 | 2.0 | 2.0 9 | 4 | 4.0 | 4.0 12 | 1 | 1.0 | 1.0 16 | 1 | 1.0 | 1.0 19 | 2 | 2.0 | 2.0 19 | 3 | 3.0 | 3.0 22 | 2 | 2.0 | 2.0 25 | 2 | 2.0 | 2.0