Oracle中的第N个最高工资

时间:2013-11-20 08:46:05

标签: sql oracle oracle11g

要找出oracle中的第N个最大值,我正在使用以下查询

SELECT DISTINCE sal 
FROM emp a 
WHERE (
       SELECT COUNT(DISTINCE sal) 
       FROM emp b 
       WHERE a.sal<=b.sal)=&n;
  • 但根据我的说法,使用上述查询,如果表格大小,执行将需要更多时间。

  • 我正在尝试使用以下查询

    SELECT sal 
    FROM (
          SELECT DISTINCE sal 
          FROM emp 
               ORDER BY sal DESC ) 
    WHERE rownum=3;
    
  • 但没有获得输出..任何建议请..请分享有关如何优化查询和减少查询执行时间的任何链接。

27 个答案:

答案 0 :(得分:19)

试试这个

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

答案 1 :(得分:4)

SELECT sal FROM (
    SELECT sal, row_number() OVER (order by sal desc) AS rn FROM emp
)
WHERE rn = 3

是的,如果表格很大,执行时间会更长。但对于“第N行”查询,唯一的方法是查看所有数据并对其进行排序。如果你在sal上有一个索引,那肯定会快得多。

答案 2 :(得分:4)

SELECT * 
FROM Employee Emp1
WHERE (N-1) = ( 
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

答案 3 :(得分:2)

这将显示表员工的第3个最高薪水。 如果你想找出第5或第6个(无论你想要的话)值,那么只需改变像where rownum<=5" or "where rownum<=6那样的where条件等等......

select min(sal) from(select distinct(sal) from emp  where rownum<=3 order by sal desc);

答案 4 :(得分:2)

我们也可以写下面提到的。

WebDriverWait wait = new WebDriverWait(driver, 6); WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("lets_go"))); el.click();

答案 5 :(得分:1)

就我而言,此查询已成功执行 (Oracle)。

...
modal.find("#portfolio-title").text(title);
    modal.find("#portfolio-tag").html(tags);
...

您可以用任何值 'n' 替换值 '10'。

答案 6 :(得分:1)

以下解决方案从12c开始有效:

<div
          class="MuiFormControl-root WithStyles(ForwardRef(FormControl))-root-16 makeStyles-formControl-11"
          data-testid="custom-form-control"
        >
          <label
            class="MuiFormLabel-root MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-shrink MuiInputLabel-marginDense MuiInputLabel-outlined Mui-focused Mui-focused"
            data-shrink="true"
            data-testid="custom-form-input-label"
            id="demo-simple-select-outlined-label"
          >
            test-title
          </label>
          <div
            class="MuiInputBase-root MuiOutlinedInput-root makeStyles-select-14 Mui-focused Mui-focused MuiInputBase-formControl"
            data-testid="custom-form-select"
          >
            <div
              aria-haspopup="listbox"
              aria-labelledby="demo-simple-select-outlined-label demo-simple-select-outlined"
              class="MuiSelect-root MuiSelect-select MuiSelect-selectMenu MuiSelect-outlined MuiInputBase-input MuiOutlinedInput-input"
              id="demo-simple-select-outlined"
              role="button"
              tabindex="0"
            >
              <span>
                ​
              </span>
            </div>
            <input
              aria-hidden="true"
              class="MuiSelect-nativeInput"
              tabindex="-1"
              value=""
            />
            <svg
              aria-hidden="true"
              class="MuiSvgIcon-root MuiSelect-icon MuiSelect-iconOutlined"
              focusable="false"
              viewBox="0 0 24 24"
            >
              <path
                d="M7 10l5 5 5-5z"
              />
            </svg>
            <fieldset
              aria-hidden="true"
              class="PrivateNotchedOutline-root-17 MuiOutlinedInput-notchedOutline"
            >
              <legend
                class="PrivateNotchedOutline-legendLabelled-19 PrivateNotchedOutline-legendNotched-20"
              >
                <span>
                  test-title
                </span>
              </legend>
            </fieldset>
          </div>

根据您的要求替换Select min(sal) from emp where Sal in ( select distinct (sal) from emp order by sal desc fetch first n rows only);

答案 7 :(得分:0)

这也有效:

with data as 
(
select sal,rwid from (
select salary as sal,rowid as rwid from salary order by salary desc
)
where rownum < 5
)
select * from salary a 
where rowid = (select min(rwid) from data)

答案 8 :(得分:0)

 SELECT sal
    FROM (
                SELECT empno,
                             deptno, sal,
                              dense_rank( ) over ( partition by deptno order by sal desc) NRANK
                FROM emp
            )
    WHERE NRANK = 4

答案 9 :(得分:0)

SELECT *
    FROM (
                SELECT empno,
                       deptno, sal,
                       dense_rank( ) over ( order by sal desc) NRANK
                FROM emp
            )
    WHERE NRANK = 4

答案 10 :(得分:0)

尝试这个:

> mydata
        Train Test Train_rank Test_rank
Method1  14.2 10.0          3         1
Method2   2.2 11.2          1         2
Method3  11.9 12.0          2         3

只需将数字添加为等级,这将使您的薪水排名第n。

答案 11 :(得分:0)

select * from (select rownum as rownumber,emp1.* from (select * from emp order by sal desc) emp1) where rownumber = 3;

答案 12 :(得分:0)

SELECT Min(sal)
FROM   (SELECT DISTINCT sal
        FROM   emp
        WHERE  sal IS NOT NULL
        ORDER  BY sal DESC)
WHERE  rownum <= n;  

答案 13 :(得分:0)

您可以使用Dense_rank()函数优化查询。

例如:

从中选择不同的薪水   (选择薪水,dense_rank()超过(按薪水降序排列)排名     来自员工   )   排名= 6

注意:排名6是第n个顺序。

答案 14 :(得分:0)

试试这个:

SELECT min(sal)  FROM (
SELECT sal FROM emp ORDER BY sal desc) WHERE ROWNUM <= 3; -- Replace 3 with any value of N

答案 15 :(得分:0)

Select min(salary) from (
  select distinct(salary) from empdetails order by salary desc
) where rownum <=&rn

只需输入您想要的第n个号码。

答案 16 :(得分:0)

select min(sal) from (select distinct(sal) from emp  order by sal desc) where rownum <=&n;

内部查询select distinct(sal) from emp order by sal desc将给出以下输出,如下所示。

<强> SAL 5000 3000 2975 2850 2450 1600 1500 1300 1250 1100 950 800

在上述查询中没有明显select sal from emp order by sal desc 输出如下。

<强> SAL 5000 3000 3000 2975 2850 2450 1600 1500 1300 1250 1250 1100 950 800

外部查询将给出'N'th max sal(E.g)我在这里尝试过的第4个Max sal和out put如下所示。

<强> MIN(SAL) 2850

答案 17 :(得分:0)

请参阅以下查询以获得第n个最高薪水。通过这种方式,你获得第n个最高薪水。如果你想获得第n个最低工资,你需要在查询中用ASC替换DESC。 for getting highest salary of employee.

答案 18 :(得分:0)

这些查询也有效:

解决方法1)

SELECT ename, sal 
FROM Emp e1 WHERE n-1 = (SELECT COUNT(DISTINCT sal) 
                         FROM Emp e2 WHERE e2.sal > e1.sal)

解决方法2)使用row_num函数。

SELECT * 
FROM ( 
   SELECT e.*, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM Emp e 
) WHERE rn = n;

解决方法3)使用rownum pseudocolumn

Select MAX(SAL) 
from (
   Select * 
   from (
      Select * 
      from EMP 
      order by SAL Desc
   ) where rownum <= n
)

答案 19 :(得分:0)

SELECT TOP (1) Salary FROM
(
    SELECT DISTINCT TOP (10) Salary FROM Employee ORDER BY Salary DESC
) AS Emp ORDER BY Salary

这是第10个最高工资,你可以用n替换10。

答案 20 :(得分:0)

您可以将 2 替换为您想要的号码

select * from ( select distinct (sal),ROW_NUMBER() OVER (order by sal desc) rn from emp ) where rn=2

答案 21 :(得分:0)

select * FROM (
select EmployeeID, Salary
, dense_rank() over (order by Salary DESC) ranking
from Employee
)
WHERE ranking = N;

dense_rank()用于工资必须相同。所以它给出了正确的输出,而不是使用rank()。

答案 22 :(得分:0)

试试以下内容:

$a = (array) $coreBootstrap->objectvar->objectvar;
unset($a[idofindex]);
$a = (object) $coreBootstrap->objectvar->objectvar;
$coreBootstrap->objectvar->objectvar = $a;

干杯!

答案 23 :(得分:0)

现在你试试这个,你肯定会得到:

SELECT DISTINCT sal 
    FROM emp a 
    WHERE (
           SELECT COUNT(DISTINCT sal) 
           FROM emp b 
           WHERE a.sal<=b.sal)=&n;

如果你想要第n个最小的sal:

,请提供您的信息
SELECT DISTINCT sal 
FROM emp a 
WHERE (
       SELECT COUNT(DISTINCT sal) 
       FROM emp b 
       WHERE a.sal>=b.sal)=&n;

答案 24 :(得分:0)

从中选择min(sal)(通过sal DESC从员工订单中选择不同的sal),其中rownum&lt; = N;

将数字放在您要检索的最高sal上。

答案 25 :(得分:-1)

有三种方法......

SELECT salary,first_name,rnk 
FROM (SELECT salary,first_name,rank() over (order by salary desc nulls last) as                                                                  rnk from emp) where rnk=3;


SELECT salary,first_name,rnk 
FROM (SELECT salary,first_name,dense_rank() over (order by salary desc nulls last) as                                                                  rnk from emp) where rnk=3;


select rnk,first_name,salary 
from (select rownum as rnk ,first_name,salary 
      from (select first_name,salary 
            from emp order by salary desc nulls last)) where rnk=3

答案 26 :(得分:-1)

第五高薪:

SELECT
    * 
FROM
    emp a 
WHERE 
    4 = (
        SELECT 
            COUNT(DISTINCT b.sal) 
        FROM 
            emp b 
        WHERE 
            a.sal < b.sal
    )

将4替换为任何N值。

相关问题