sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL ekvivalent pro TOP n WITH TIES:LIMIT with ties?

Postgres 13 nakonec přidá WITH TIES . Viz:

  • Větší nebo rovna ALL() a rovna MAX() rychlosti

Neexistuje žádné WITH TIES klauzule až po PostgreSQL 12, jako je tomu v SQL Server.
V PostgreSQL bych to nahradil za 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;

Aby bylo jasno, rank() má pravdu, dense_rank() by bylo špatné (vrací příliš mnoho řádků).
Zvažte tento citát z dokumentů SQL Server (z odkazu výše):

Pokud je například výraz nastaven na 5, ale 2 další řádky odpovídají hodnotám sloupců ORDER BY v řádku 5, bude sada výsledků obsahovat 7 řádků.

Úloha WITH TIES je zahrnout všechny partnery z posledního řádku v horním n jak je definováno v ORDER BY doložka. rank() dává přesně stejný výsledek.

Pro jistotu jsem testoval s SQL serverem, zde je živé demo.
A zde je pohodlnější SQLfiddle.



  1. Volání uložené procedury pomocí VBA

  2. Příklady RADIANS() v SQL Server

  3. Názvy sloupců nabídek Oracle DB

  4. Úroveň izolace opakovatelného čtení