PostgreSQL эквивалент для TOP n с TIES: LIMIT "со связями"? - PullRequest
9 голосов
/ 09 марта 2012

Я ищу что-то подобное в 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 ]

8 голосов
/ 09 марта 2012

В 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 дополнительные строки соответствуют значениям столбцов ORDER BY в строке 5, результирующий набор будет содержать 7 строк.

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

Чтобы убедиться, что я проверил на SQL-сервере, вот live demo .
А вот более удобный SQLfiddle.

2 голосов
/ 09 марта 2012

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

Вывод: 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
...