Em 17 de julho de 2014 09:18, Euler Taveira <[email protected]> escreveu:

> On 17-07-2014 08:41, Luciano Bierhals wrote:
> > Peço desculpas pela falta de clareza da minha parte. O exemplo é o
> seguinte:
> >
> > Tabela existente:
> >
> >   *Código* *Indicador1* *Indicador2*  1 1 21  2 2 22  3 3 23  4 4 24  5
> 5 25
> > 6 6 26  7 7 27  8 8 28  9 9 29  10 10 30
> >
> >
> >
> > View necessária
> >
> >    *Indicador1-Ate33* *Indicador1-Acima66* *Indicador2-Ate33*
> > *Indicador2-Acima66*  3 7 23 27
> >
> >
> > *Ate33 - Valor máximo dos 33% piores registros.
> > *Acima66 - Valor mínimo dos 33% melhores registros
> >
> O que você quer chama-se quartil. Para produzir o resultado desejado
> basta utilizar funções deslizantes (aka window functions) -- vide
> ntile() e/ou last_value().
>
>
Obrigado Euler, sua informação foi muito importante.

O ntile() não retornou exatamente o que eu precisava. Entretanto, consegui
encontrar o percent_rank(), que me retorna o que percentual. Desta forma,
estou pensando em montar uma view com a seguinte estrutura:



SELECT inretorno_33, inretorno_66, nrmatriztotal_33, nrmatriztotal_66
--Indicador 1 - nrmatriztotal
  FROM (SELECT 1 AS a, max(a.nrmatriztotal) as nrmatriztotal_33,
min(b.nrmatriztotal) as nrmatriztotal_66
  FROM (SELECT 1 AS a, nrmatriztotal, percent_rank() over (order by
nrmatriztotal) as nrmatriztotal_33
          FROM indicadores.eindcoleta) a
  JOIN (SELECT 1 AS a, nrmatriztotal, percent_rank() over (order by
nrmatriztotal) as nrmatriztotal_66
          FROM indicadores.eindcoleta) b ON a.a = b.a
  WHERE a.nrmatriztotal_33 <= 0.33 AND b.nrmatriztotal_66 >= 0.66 )
nrmatriztotal

--Indicador 2 - inretorno
JOIN (SELECT 1 AS a, max(a.inretorno) as inretorno_33, min(b.inretorno) as
inretorno_66
  FROM (SELECT 1 AS a, inretorno, percent_rank() over (order by inretorno)
as inretorno_33
          FROM indicadores.eindcoleta) a
  JOIN (SELECT 1 AS a, inretorno, percent_rank() over (order by inretorno)
as inretorno_66
          FROM indicadores.eindcoleta) b ON a.a = b.a
  WHERE a.inretorno_33 <= 0.33 AND b.inretorno_66 >= 0.66 ) inretorno  on
nrmatriztotal.a = inretorno.a



Desta forma, para cada um dos 60 indicadores da tabela, eu acrescento uma
seção destas.
Alguém visualiza alguma outra forma mais otimizada de trazer estes dados?

Obrigado pela atenção!!

Abs,
Luciano
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a