給与が最も高い上位 2 人の従業員を見つけます。
テーブル名はsalary
、列はname,salary
limit コマンドを次のように使用して、このクエリを実行できます。
select * from salary order by salary DESC limit 0,2
しかし、top と limit を使用せずにこれを行うにはどうすればよいでしょうか?
このインタビューの質問は、ネストされた選択、または一般的なテーブル式、またはそのようなものにあなたを誘導しようとしていると思います. TOP 2
は簡単な答えであり、明らかTOP
にこの目的のために実装されています。インタビューでは、「手動で」行うように求められています。
理論コードで。最初の(ネストされた)選択で各行に行数を指定し、その結果から行数が必要な行数(この場合は3)よりも1少ない数を選択します。
ネストされた選択 (疑似コード):
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)。
これが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
SQL:2008 標準に従ってFETCH FIRST 10 ROWS ONLY
、クエリに追加できます。とはいえ、私はこれを試したことはありません。だからあなたの場合、あなたは持っているでしょう
SELECT * FROM salary ORDER BY salary DESC FETCH FIRST 2 ROWS ONLY
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
)
+------+
| 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 )
テーブル構造
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))