3

次のクエリを参照して、従業員の N 番目に高い給与を見つけます。

select sal from emp t where &n = (select count(sal) from (select distinct sal 
 from emp) where t.sal<=sal);

ある紳士は、このクエリが機能すると言いました。誰かがどのように COUNT (これは実際には 1 から X の間の値になり、X は個別の給与の合計である) を &n としてこの結果を生成するかを説明してもらえますか?

データベースがこのクエリを内部的に処理し、結果を生成する方法を理解しようとしていますか?

ありがとうございました。

4

11 に答える 11

8

まず、クエリはnth 最低の給与値を返します。給与の最高値を返すには、 に変更するnth必要があります。t.sal <= salt.sal >= sal

次に、このクエリは、最初に給与値の個別のリストを 1 つの派生テーブルとして検索することによって機能し、次に、このリスト内の各従業員よりも給与が少ない従業員の数を特定します。t.sal <= sal派生テーブル (ほとんどのデータベースではエイリアスが必要です) を取得し、各値を外部empテーブルと比較しています。同数の場合、これは複数の行を返すことに注意してください。

出力を手動でトレースするには、いくつかの入力が必要です。

Alice       | 200
Bob         | 100
Charlie     | 200
Danielle    | 150

Select Distinct sal
From emp

私たちに与えます

200
100
150

次に、外側のテーブルの各行を分析します

Alice - There are 3 distinct salary values less than or equal to 200
Bob - 1 rows <= 100
Charlie - 3 rows <= 200
Danielle - 2 row <= 150

したがって、各給与値について、次のカウントを取得します (カウントで並べ替えます)。

Bob 1
Danielle 2
Charlie 3
Alice 3

あなたが見落としていると思う最も重要な側面は、外側のempテーブルが内側のカウント計算に相関していることです (これが相関サブクエリと呼ばれる理由です)。つまり、外側のempテーブルの各行について、 を介してその行の給与の新しいカウントが計算されt.sal <= salます。繰り返しますが、ほとんどのデータベース システムでは、最も内側のクエリに次のようなエイリアスが必要です (エイリアスに注意してくださいAs Z)。

Select sal
From emp As t
Where &n =  (
            Select Count(Z.sal)
            From    (
                    Select Distinct sal
                    From emp
                    ) As Z
            Where t.sal <= Z.sal
            )
于 2012-05-08T04:17:05.843 に答える
1
select sal 
from (
  select sal, 
         dense_rank() over (order by sal desc) as rnk
) t
where rnk = 5;

where rnk = 5必要な「nth」に置き換えます。

于 2013-05-31T22:51:04.763 に答える
1

n 番目に高い給与値を取得するには、'N' の値を入力します。

Select Min(Salary) From (Select Top N * From Table_Name Order by Salary Desc);
于 2013-05-31T22:05:45.830 に答える
0
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC) a
ORDER BY salary
where n > 1 (n is always
于 2013-06-13T06:39:22.487 に答える
0

n 番目に高い給与値を変更するには、'N' の値を入力します

SELECT e1.EmployeeName, e1.EmployeeSalary from Employee e1
where N = (
select COUNT(e2.EmployeeSalary) from Employee e2 where e2.EmployeeSalary >= e1.EmployeeSalary)
于 2014-01-08T16:53:04.400 に答える
0

次のようなデータベース レコード データ エントリで

employ_id    NAME     salary
101          Henry    24000
102          Smith    24000
105          Roy      17000  
106          Robbin   15000 
702          Mac      2500
708          Bill     2100
709          Kane     2000
710          Ted      2000

ここで同じ給与を持っている一部の従業員の場合、n番目(最高/最低)の給与を計算する方法

3番目に高い給与の計算用

select * from emloyees where salary in (select salary from (select rownum rank , salary from (select distinct salary from employees order by salary **desc**)) where rank =3;

ans = 15000

同様に、3 番目に低い給与を計算する desc の代わりに小さな変更を加えて同じクエリを入力します asc を入力します

select * from emloyees where salary in (select salary from (select rownum rank , salary from (select distinct salary from employees order by salary **asc**)) where rank =3;

これがあなたを助けることを願っています

于 2013-09-03T07:25:14.800 に答える
0

これを達成する方法はたくさんあります:-

1)

 Select Top(1) sal from emp 
    where sal not in (select DISTINCT top(n-1) sal from emp order by sal desc)

2)

select salary     
          from (
           select salary,
           roe_number() over (order by salary ) as row from emp
          ) emp1
  where row= n;
  • このクエリは、複数の行が次々に同じ値を持つ場合には機能しません。

3)

select salary     
              from (
               select salary,
               dense_rank() over (order by salary ) as row from emp
              ) emp1
      where row= n;
  • これにより、すべての一意の給与額に対して一意の行番号が作成されます。

4)

 Select Min(sal) From 
       (Select DISTINCT Top n * From emp Order by sal Desc)as emp1;

5)

   SELECT * FROM emp Emp1
            WHERE (n-1) = (
                             SELECT COUNT(DISTINCT(Emp2.Sal))
                             FROM emp Emp2
                             WHERE Emp2.Sal > Emp1.Sal)
于 2014-12-03T05:36:58.853 に答える
-1

クエリ:

select 
    ename  
    ,sal  
    ,dense_rank() over (order by sal desc) ranking  
from   emp;  

出力:

ENAME   SAL   RANKING
KING    5000    1   
FORD    3000    2  
SCOTT   3000    2  
JONES   2975    3  
CLARK   2850    4  
BLAKE   2850    4  
ALLEN   1600    5  

フィルターをラップして、N 番目に高い給与、たとえば 4 番目に高い給与を選択します。

クエリ:

select *  
from  
(  
  select ename  
        ,sal  
        ,dense_rank() over (order by sal desc) ranking  
  from   emp  
)  
where ranking = 4 -- Replace 4 with any value of N  

出力:

ENAME  SAL  RANKING
BLAKE  2850     4  
CLARK  2850     4  
于 2016-08-05T06:51:25.123 に答える