PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Equivalente do PostgreSQL para TOP n WITH TIES:LIMIT with tie?


Postgres 13 finalmente adiciona WITH TIES . Ver:
  • Maior ou igual a ALL() e igual a MAX() velocidade

Não há WITH TIES cláusula até o PostgreSQL 12, como existe no SQL Server.
No PostgreSQL eu substituiria por TOP n WITH TIES .. ORDER BY <something> :
WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

Para ser claro, rank() está certo, dense_rank() estaria errado (retornar muitas linhas).
Considere esta citação dos documentos do SQL Server (do link acima):

Por exemplo, se a expressão for definida como 5, mas 2 linhas adicionais corresponderem aos valores das colunas ORDER BY na linha 5, o conjunto de resultados conterá 7 linhas.

O trabalho de WITH TIES é incluir todos os pares da última linha no topo n conforme definido pelo ORDER BY cláusula. rank() dá exatamente o mesmo resultado.

Para ter certeza, eu testei com o SQL Server, aqui está uma demonstração ao vivo.
E aqui está um SQLfiddle mais conveniente.