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 ответа:
В 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