PostgreSQL эквивалент для TOP n WITH TIES: ограничение "с завязками"?


Я ищу что-то подобное этому в SQL Server:

SELECT TOP n WITH TIES FROM tablename

Я знаю о LIMIT в PostgreSQL,но существует ли эквивалент вышеописанного? Мне просто любопытно, так как это сэкономит дополнительный запрос каждый раз для меня.

Если у меня есть таблица Numbers с атрибутом nums: {10, 9, 8, 8, 2}. Я хочу сделать что-то вроде:

SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3

Он должен вернуть {10, 9, 8, 8}, потому что он берет верхние 3 плюс дополнительные 8, так как он связывает другой.

2 9

2 ответа:

В PostgreSQLнет предложения WITH TIES, как вSQL Server .
В PostgreSQL я бы заменил это на 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;

Чтобы было понятно, rank() это правильно, dense_rank() было бы неправильно (возвращать слишком много строк).
Рассмотрим эту цитату из документов SQL Server (по ссылке выше):

Например, если выражение имеет значение 5, но 2 дополнительные строки соответствуют значения порядка по столбцам в строке 5, результирующий набор будет содержать 7 строки.

Задача WITH TIES состоит в том, чтобы включить все узлы последней строки в верхнююn , как определено в предложении ORDER BY. rank() дает точно такой же результат.

Чтобы убедиться, я протестировал с SQL server, вотживая демонстрация .
А вот более удобныйSQLfiddle .

Попробуйте это:

Вывод: 10, 9, 8, 8

with numbers (nums) as (
  values (10), (9), (8), (8), (2)
) 
SELECT nums FROM Numbers 
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC

Выход: 10,10,9,8,8

with numbers (nums) as (
  values (10), (9), (8), (8), (2), (10)
) 
SELECT nums FROM Numbers 
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC