Эквивалент PostgreSQL для TOP n With TIES:ОГРАНИЧИТЬ «с завязками»?
-
09-12-2019 - |
Вопрос
Я ищу что-то подобное в 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
поскольку оно связывает другое.
Решение
Здесь нет WITH TIES
пункт в PostgreSQL как есть в SQL-сервер.
В 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
заключается в включении всех пиров последней строки в верхнюю часть н как это определено ORDER BY
пункт. rank()
дает точно такой же результат.
Чтобы убедиться, я протестировал SQL-сервер, вот живая демонстрация.
А вот удобнее 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