4

給与が最も高い上位 2 人の従業員を見つけます。

テーブル名はsalary、列はname,salary

limit コマンドを次のように使用して、このクエリを実行できます。

select * from salary order by salary DESC limit 0,2

しかし、top と limit を使用せずにこれを行うにはどうすればよいでしょうか?

4

8 に答える 8

4

このインタビューの質問は、ネストされた選択、または一般的なテーブル式、またはそのようなものにあなたを誘導しようとしていると思います. TOP 2は簡単な答えであり、明らかTOPにこの目的のために実装されています。インタビューでは、「手動で」行うように求められています。

理論コードで。最初の(ネストされた)選択で各行に行数を指定し、その結果から行数が必要な行数(この場合は3)よりも1少ない数を選択します。

MySQL - 選択時に行番号を取得

ネストされた選択 (疑似コード):

select row_count, * from salary order by salary desc

アウターセレクト:

select * from <nested select> where row_count < 3

申し訳ありませんが、これは MySQL のコードではありませんが、私は SQL Server しか知りません。

行数を使用して機能する SQL Server コードがいくつかあります。

declare @Salaries table
(
   id int,
   salary money
)

insert into @salaries (id, salary)
values (1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 4)  -- A duplicating salary

;WITH Props AS
(
    SELECT *,
        ROW_NUMBER() OVER (ORDER BY salary desc) AS RowNumber
    FROM @Salaries
)
SELECT * FROM Props WHERE RowNumber < 3

これにより、ID 4 と 5 の行が返されます。


Sachin Kainthの答えへの取り組み

この答えは間違っていると思います。次の SQL Server コードを試してください。

declare @Salaries table
(
   id int,
   salary money
)

insert into @salaries (id, salary)
values (1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 4)

select * from @salaries where salary in -- "in" introduces the problem
(
SELECT MAX(E1.Salary)  
FROM @salaries E1, @salaries E2
WHERE E1.Salary < E2.Salary

union

SELECT MAX(Salary)  
FROM @salaries
)

これは、ID が 3、4、5 の行を返します。4 と 5 だけではなく、外側の select with 句where salary inが行 3、4、5 を取得するためです。これらのすべての行には、ネストされた select (給与を返す) によって給与が返されます。値 3 および 4)。

于 2012-05-23T14:40:13.620 に答える
1

これがMySQLにあります:

SET @row := 0;
SELECT name, salary FROM
(SELECT name, salary, @row := @row + 1 AS Row FROM salary ORDER BY salary DESC)
  AS derived1
WHERE Row < 3

まだ注意点があります。給与が重複していると、結果が歪む可能性があります。結果セットが2行を超える場合、タイは結果に含まれませんが、質問は給与が最も高い2人の従業員であり、給与が最も高い2人の従業員ではないため、これが私にできる最善の方法です。

たぶん正しい答えは、「給与が重複している場合はどうすればよいですか?」と尋ねることです。

絶対に単一のクエリである必要がある場合の秘訣は次のとおりです。

SELECT name, salary FROM
(SELECT name, salary, @row := @row + 1 AS Row FROM (SELECT @row := 0) AS d1, salary)
  AS d2
WHERE Row < 3
于 2012-05-23T15:37:47.243 に答える
1

SQL:2008 標準に従ってFETCH FIRST 10 ROWS ONLY、クエリに追加できます。とはいえ、私はこれを試したことはありません。だからあなたの場合、あなたは持っているでしょう

SELECT * FROM salary ORDER BY salary DESC FETCH FIRST 2 ROWS ONLY
于 2012-05-23T14:42:38.643 に答える
0
select * from salary where salary in
(
SELECT MAX(E1.Salary)  
FROM Salary E1, Salary E2
WHERE E1.Salary < E2.Salary

union

SELECT MAX(Salary)  
FROM Salary
)
于 2012-05-23T14:39:31.367 に答える
0
+------+
| Sal  |
+------+
| 3500 | 
| 2500 |
| 2500 | 
| 5500 |
| 7500 |
+------+

次のクエリは、Nth Maximum 要素を返します。

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )
于 2013-09-05T07:37:28.167 に答える
0

テーブル構造

CREATE TABLE `emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `salary` int(10) DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

n番目の用語nのMysqlクエリは、アイテムのn番目の番号を表します

SELECT salary 
FROM emp 
WHERE salary = (SELECT DISTINCT(salary) 
                FROM emp AS e1 
                WHERE (n) = (SELECT COUNT(DISTINCT(salary)) 
                             FROM emp AS e2 
                             WHERE e1.salary <= e2.salary))
于 2015-05-05T11:39:28.437 に答える