2016-07-05 3 views
0

Какова логика в следующем запросе для поиска n-го наивысшего значения в таблице?Как найти n-е наивысшее значение в таблице в SQL Server

select * 
from tablename as a 
where (n-1) = (select count(distinct(column name) 
       from tablename as b 
       where b.columname > a.columnname) 

Пример запроса:

select * 
from tblperson a 
where 3 = (select count(distinct(expenses)) 
      from tblperson b 
      where b.Expenses > a.Expenses) 
+4

что ваш DBMS ? –

+0

Я использую Microsoft SQL Server – Thulasiram

+0

Соблюдайте свой вопрос соответствующим образом. Вы отметили «SQL», который является «структурированным языком запросов», а не «SQL Server». –

ответ

1

Вы можете использовать функцию OFFSET FETCH Clause (SQL Server Compact):

SELECT * 
FROM tablename 
ORDER BY expenses DESC 
OFFSET N - 1 ROWS -- Nth highest (N-1 offset) 
FETCH NEXT 1 ROWS ONLY; 
+0

Простите мою краткость, потому что я на моем телефоне, но это может помочь. Ваше заявление получает упорядоченный список, потому что список упорядочен по рангу, просто добавьте 'OFFSET n LIMIT 1' и он вернет один элемент, расположенный в n-м элементе упорядоченного списка, что даст желаемый результат. –

+0

@JakePsimos, который будет работать, если OP использует mysql. Однако они ясно заявили, что используют сервер sql. –

+0

@JakePsimos, спасибо за ваш намек. Мой ответ был неправильным, см. Мое обновление, 'OFFSET' в MS SQL. –

0

Запрос говорит для каждой строки идти и подсчитать, сколько уникальных значений в таблице с большее значение (в конкретном столбце), чем тот, на который я смотрю. Держите только те (связи), которые попадают в определенную позицию. Итак, для 4-го места вы ожидаете найти 3 значения, которые выше.

Это выполняется посредством внутреннего запроса, который называется коррелированным подзапросом. Хотя у сервера, вероятно, будет более эффективный способ фактического вычисления результатов, вы можете думать о нем как о цикле с вызовом функции. Внутренний запрос логически выполняется один раз для каждой строки во внешнем запросе, а ссылки (ссылки) на a внутри него постоянны для каждого из этих прогонов.

Переписывание этого способа может помочь вам понять. (И вы можете также проверить внутренний запрос сам по себе.)

select * from 
(
    select 
     a.columnname, 
     (
      select count(distinct columnname) 
      from tablename as b 
      where b.columnname > a.columnname 
     ) as NumRowsGreater 
    from tablename as a 
) as t 
where NumRowsGreater = (n-1) 
+0

Я сомневаюсь, что подзапрос вернет число отсчетов, из которых выполняется условие where, но как основной запрос возвращает максимальное значение, поскольку он сравнивает только значение «где (n-1) =« – Thulasiram

+0

@Thulasiram Я не могу точно определить ваше замешательство, чтобы я мог лучше объяснить это. Изучите мое объяснение, потому что я думаю, что вы не понимаете, как работает корреляция. – shawnt00

0

в SQL-сервере попробовать этот

select TOP 3 * FROM tblperson order by Expenses DESC 

или что-то подобное в хранимых процедурах

select TOP @N * FROM tblperson order by Expenses DESC 
+0

Должна быть возвращена только N-я строка. –