Facilidades do Oracle: Usando MAX() com PARTITION BY

Salve, salve.
Quem já navegou pela documentação do Oracle, pôde (terceira pessoa do singular do pretérito perfeito do indicativo do verbo poder) supreender-se com a quantidade de recursos, principalmente na área das funções para aggregate e analytic. Tentarei selecionar algumas para fazermos um comparativo, demonstrando a aplicação em apropriados (ou não) casos de uso. :D

Para começar essa série, vamos à questão:
Selecionar de todas as linhas da tabela, o valor do campo data, e juntamente trazer a maior data em que há registro do mês referente. (com uma só query, obviamente)

Para o MySQL, não vemos outro jeito se não uma subquery. Ou fazendo join com uma tabela derivada.

SELECT DATA, 
  (SELECT MAX(DATA) 
     FROM teste 
	 WHERE EXTRACT(YEAR_MONTH FROM DATA) = EXTRACT(YEAR_MONTH FROM a.DATA)) max_data
  FROM teste a

Assim teremos o resultado desejado:

+------------+------------+
| data       | max_data   |
+------------+------------+
| 2009-01-05 | 2009-01-30 | 
| 2009-01-20 | 2009-01-30 | 
| 2009-02-14 | 2009-02-28 | 
| 2009-01-30 | 2009-01-30 | 
| 2009-02-28 | 2009-02-28 | 
+------------+------------+

Já no Oracle, nós não precisamos montar a subquery, simplesmente usamos a Window function MAX() com a cláusula PARTITION BY, veja:

SELECT DATA, MAX(DATA) OVER (PARTITION BY TO_CHAR(DATA, 'YYYYMM')) max_data
  FROM teste

Simples assim!

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options