Эквивалент PostgreSQL для TOP n With TIES:ОГРАНИЧИТЬ «с завязками»?

StackOverflow https://stackoverflow.com//questions/9629953

Вопрос

Я ищу что-то подобное в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top