PostgreSQL equivalent for TOP n WITH TIES: LIMIT “with ties”?

后端 未结 3 1830
遥遥无期
遥遥无期 2020-11-29 09:00

I\'m looking for something similar this in SQL Server:

SELECT TOP n WITH TIES FROM tablename

I know about LIMIT in PostgreSQL,

3条回答
  •  旧时难觅i
    2020-11-29 09:23

    Postgres 13 finally adds WITH TIES . See:

    • Greater than or equal to ALL() and equal to MAX() speed

    There is no WITH TIES clause up to PostgreSQL 12, like there is in SQL Server.
    In PostgreSQL I would substitute this for TOP n WITH TIES .. ORDER BY :

    WITH cte AS (
       SELECT *, rank() OVER (ORDER BY ) AS rnk
       FROM   tbl
       )
    SELECT *
    FROM   cte
    WHERE  rnk <= n;
    

    To be clear, rank() is right, dense_rank() would be wrong (return too many rows).
    Consider this quote from the SQL Server docs (from the link above):

    For example, if expression is set to 5 but 2 additional rows match the values of the ORDER BY columns in row 5, the result set will contain 7 rows.

    The job of WITH TIES is to include all peers of the last row in the top n as defined by the ORDER BY clause. rank() gives the exact same result.

    To make sure, I tested with SQL server, here is a live demo.
    And here is a more convenient SQLfiddle.

提交回复
热议问题