Visão geral dos recursos para a realização de consultas com Window Functions implementados na versão 8.4 do banco de dados PostgreSQL, do seu funcionamento e das formas como esta funcionalidade pode ser utilizada em aplicações de banco de dados, com exemplos e considerações práticas.
Para que serve?
Fornecer uma visão geral para subsidiar a construção de consultas envolvendo as novas Window Functions implementadas no PostgreSQL, poupando esforço na construção de rotinas de ranqueamento e classificação e obtendo ganhos de desempenho. Tal visão engloba o conceito de partição (window) de dados, essencial para o entendimento das possibilidades de agrupamento dos dados nas consultas.
Em que situação o tema é útil?
O tema é obrigatório quando tratamos de consultas onde sejam necessários ranqueamentos e ordenações de registros em geral, de qualquer grau de sofisticação, com qualquer tipo de particionamento dos dados, feitas no PostgreSQL. Relatórios em que se deseje fazer o destaque de primeiros/últimos registros em alguma partição também se beneficiam desta nova funcionalidade.
Window Functions (WFs) são um recurso ainda pouco conhecido e implementado em bancos de dados livres. Window Functions são formas de consultar dados que complementam as tradicionais funções de agregação do SQL: SUM, COUNT, AVG, MAX e MIN, possibilitando novas formas de acesso a um menor custo computacional e com uma sintaxe mais apropriada.
Em linhas gerais, uma window function atua de forma similar a uma função de agregação tradicional, que computa uma série de registros com base em uma condição que os agrupa. No entanto, ao invés de retornar os dados em uma linha, como em um somatório por exemplo, uma WF retorna os resultados calculados sem reduzir o número de registros apresentados ao usuário.
Os conjuntos de registros que se deseja agregar são chamados windows (janelas), ou partições, daí a denominação window functions para estas funcionalidades de consulta. Por exemplo, podemos criar uma partição pelo campo cidade, dividindo os registros em partições criadas para cada localidade.
As operações realizadas pelas WFs estão relacionadas a operações de numeração de registros (ROW_NUMBER()), classificação e ranqueamento (RANK(), DENSE_RANK(), PERCENT_RANK()), criação de subdivisões de uma partição (NTILE(), LAG() e LEAD()), recuperação de primeiro, último ou enésimo registro de uma window (FIRST_VALUE(), LAST_VALUE(), NTH_VALUE()) e medida de distância ou posição relativa em relação ao início de uma partição para cada registro (CUME_DIST()), de acordo com a sua window. Como exemplos de window, falando em um sistema de controle de impostos estadual, podemos pensar na criação partições pelo campo cidade e ordenação dos seus registros pelo valor dos impostos devidos, resultando em um relatório gerencial. Em uma aplicação que automatiza processos de seleção, podemos pensar em um indicador que diga o quão longe está cada indivíduo da primeira posição, usando uma medida de distância relativa.
Em suma, o conceito de wf engloba funções que solucionam problemas que envolvem consultas a registros de partições de dados com base em algum critério, tais como:
• Quais são os primeiros colocados em determinado processo de seleção?
• Quem tirou as piores notas?
• Quanto falta para atingir determinada posição em um ranking?
• Que indivíduos obtiveram destaque positivo ou negativo?
A Tabela 1 apresenta a série de wfs implementadas pelo PostgreSQL 8.4. Os detalhes de funcionamento de cada função serão descritos e exemplificados nas seções seguintes.
O presente texto detalha a utilização das Wfs, descreve questões éticas que devem ser levadas pelos desenvolvedores e apresenta questões práticas a respeito da utilização deste recurso nas aplicações de banco de dados.
...