Conseguir o segundo valor mais alto de uma tabela já foi resolvido muitas vezes, mas estou procurando o segundo valor mais alto em cada grupo .
Dada esta tabela:
+----+-----+
| A | 10 |
| A | 20 |
| A | 35 | <-- This record
| A | 42 |
| B | 12 |
| B | 21 | <-- This record
| B | 33 |
| C | 14 |
| C | 23 |
| C | 38 |
| C | 41 | <-- This record
| C | 55 |
+----+-----+
Eu gostaria de obter as linhas marcadas.
Pseudo-código:
select col_a, penultimate(col_b)
from foo
group by col_a;
Você pode usar funções de janela para isso.
Assumindo valores distintos por grupo. Portanto, não precisamos romper laços.
Assumindo pelo menos 2 linhas por grupo - ou as seguintes quebras de consulta. (Você precisaria fazer mais, começando definindo o "2º valor mais alto" para esses casos.)
Com mais do que algumas linhas por grupo (e embora esse recurso não seja implementado diretamente, ainda, a partir da página 14), uma varredura de salto de índice emulado será (muito) mais rápida. Um pouco complicado para obter o segundo valor mais alto:
db<>fique aqui
Ver:
Requer um índice aplicável para ser rápido. Curti:
O Postgres pode varrer um índice para trás praticamente na velocidade máxima. Mas a ordem de classificação combinada das colunas não pode discordar da consulta. Ver: