Как найти 3-е максимальное значение столбца, используя функцию MAX в SQL Server? - PullRequest
1 голос
/ 19 марта 2010

Вчера у меня был вопрос в интервью, на который я думал, что смогу найти ответы здесь, в SO ...

Как найти 3-е максимальное значение столбца с помощью функции MAX на сервере SQL?

Рассмотрим столбец

Заработная плата
20000
15000
10000
45000
50000

Ответы [ 9 ]

4 голосов
/ 19 марта 2010

Очень некрасиво, но только с использованием MAX

DECLARE @Table TABLE(
        Wages FLOAT
)

INSERT INTO @Table SELECT 20000 
INSERT INTO @Table SELECT 15000 
INSERT INTO @Table SELECT 10000
INSERT INTO @Table SELECT 45000
INSERT INTO @Table SELECT 50000

SELECT  MAX(Wages)
FROM    @Table WHERE Wages < (
                        SELECT  MAX(Wages)
                        FROM    @Table WHERE Wages < (
                                                SELECT  MAX(Wages)
                                                FROM    @Table)
                                )

Лично я бы пошел с

SELECT  *
FROM    (
            SELECT  *,
                    ROW_NUMBER() OVER(ORDER BY Wages DESC) RowID
            FROM    @Table 
        ) sub
WHERE   RowID = 3

А затем спросил интервьюера, почему они когда-нибудь захотят решение с использованием MAX, когда они могут использовать встроенную функциональность.

2 голосов
/ 14 декабря 2012

Мы тоже можем сделать что-то подобное, но я действительно думаю, что это очень плохая идея ..

SELECT TOP 1 col1 
FROM dbo.temp
WHERE col1 NOT IN ( 
            SELECT TOP 2 MAX(col1) 
            FROM dbo.temp
            GROUP BY col1 
            ORDER BY col1 DESC) 
ORDER BY col1 DESC
2 голосов
/ 19 марта 2010

Без использования MAX вот что я могу думать:

SELECT MIN(Wages) FROM
(
    SELECT TOP 3 Wages FROM table ORDER BY Wages DESC;
) As tmp;

Выберите таблицу, найдя 3 верхние зарплаты. Затем выберите min из предыдущего набора результатов.

ОБНОВЛЕНИЕ : Хорошо, просто прочитайте, что оно должно использовать функцию МАКС. Я согласен с ответом Астандера.

1 голос
/ 26 декабря 2018
SELECT *

FROM table_name temp1

WHERE (n) = (

SELECT COUNT( DISTINCT (temp2.field_name))

FROM table_name temp2

WHERE temp2.field_name > temp1.field_name

)

Здесь n = 3 для 3-го максимума

1 голос
/ 05 июня 2014
select distinct wages 
from @table e1 
where (select count(distinct sal) from @table e2 where e1.wages <= e2.sal)=3;
0 голосов
/ 22 декабря 2018

select wages from table_name order by wages desc limit 2,1

0 голосов
/ 08 октября 2013
select min(salary) from (select salary from(select salary from table_name order by salary desc)where rownum<=n);

для n-й наивысшей зарплаты.

Извлечение:

Сначала будет упорядочен столбец зарплаты в порядке убывания, затем будут выбраны первые 3 оклада, а затем будет выбран минимальный оклад из выбранногопервые 3 оклада, что является третьим по величине окладом.

0 голосов
/ 18 декабря 2012

select MAX(Salary) from ( select top 3 Salary from emp1 order by Salary asc ) as tmp

0 голосов
/ 19 марта 2010

Хорошо. Прочитайте, что я должен использовать функцию Max:

With RankedWages As
    (
        Select Wage
            , Row_Number() Over( Order By Wage Desc ) As WageRank
        From Wages
    )
Select Wage
From RankedWages As W1
Where WageRank =    (
                    Select Max(W2.WageRank)
                    From RankedWages As W2
                    Where W2.WageRank <= 3
                    )

Кстати, если бы правилом было то, что у вас было для использования MAX (имеется в виду где угодно), вы могли бы найти chea..eh..находить умный обходной путь, выполнив:

;With RankedWages As
    (
        Select Wage
            , Row_Number() Over( Order By Wage Desc ) As WageRank
        From Wages
    )
Select Max(Wage)
From RankedWages As W1
Where WageRank = 3
...