1

geosalarynameid、および で名前が付けられたテーブルを作成しましたsalary:

name   id  salary  
patrik  2  1000  
frank   2  2000  
chinmon 3  1300  
paddy   3  1700  

以下のコードを試して、2番目に高い給与を見つけました。

SELECT salary
FROM (SELECT salary, DENSE_RANK() OVER(ORDER BY SALARY) AS DENSE_RANK FROM geosalary)
WHERE DENSE_RANK = 2;

ただし、次のエラー メッセージが表示されます。

ERROR: subquery in FROM must have an alias  
SQL state: 42601  
Hint: For example, FROM (SELECT ...) [AS] foo.  
Character: 24  

コードの何が問題になっていますか?

4

9 に答える 9

5

エラー メッセージは明らかです。サブクエリのエイリアスを指定する必要があります。

これは、よりシンプルで高速な代替手段です。

SELECT DISTINCT salary
FROM   geosalary
ORDER  BY salary DESC NULLS LAST
OFFSET 1
LIMIT  1;

これは、「2 番目に高い給与」(1 行) を検索します。これは、2 番目に高い給与 (1 行から n 行) を持つすべての従業員を検索する他のクエリとは対照的です。

NULLS LASTNULL 値は通常、この目的で最初にランク付けされるべきではないため、を追加しました。見る:

于 2013-07-12T07:34:52.007 に答える
0
WITH salaries AS (SELECT salary, DENSE_RANK() OVER(ORDER BY SALARY) AS DENSE_RANK FROM geosalary)
SELECT * FROM salaries WHERE DENSE_RANK=2;
于 2013-07-12T07:09:38.697 に答える
0
select  level, max(salary)
from   geosalary
where   level=2
connect  by
prior   salary>salary
group  by  level;
于 2013-07-14T17:11:20.173 に答える
0

SQL エンジンは、使用しているテーブルの "salary" 列を認識していないため、エイリアスを使用して 2 つの列を区別する必要があります。これを試して:

SELECT salary
FROM (SELECT G.salary ,DENSE_RANK() OVER(ORDER BY G.SALARY) AS DENSE_RANK FROM geosalary G)
WHERE DENSE_RANK=2;
于 2013-07-12T07:06:26.993 に答える
-1
SELECT MAX(salary) FROM geosalary WHERE salary < ( SELECT MAX(salary) FROM geosalary )
于 2013-07-12T07:06:56.353 に答える