Exforsys
+ Reply to Thread
Results 1 to 9 of 9

How to find second max sal of employee with the co

This is a discussion on How to find second max sal of employee with the co within the Oracle Database forums, part of the Database category; Hi all I want to display the entire row of the employee who is havong second highest sal can any ...

  1. #1
    chandraismoon is offline Junior Member Array
    Join Date
    Sep 2004
    Answers
    5

    How to find second max sal of employee with the co

    Hi all
    I want to display the entire row of the employee who is havong second highest sal

    can any one help me

    Vaibhav


  2. #2
    sanereddy is offline Member Array
    Join Date
    Nov 2004
    Answers
    85

    Re:How to find second max sal of employee with the co

    chandraismoon, Please find the sample code and description on how it works. Let me if you have any questions. All the examples discussed in this article uses Employee table. If you do not have this table, please use the following script to create it.

    Use Pubs
    Go

    Create table Employee
    (
    Eid int,
    Name varchar(10),
    Salary money
    )
    Go

    Insert into Employee values (1,\'harry\',3500)
    Insert into Employee values (2,\'jack\',2500)
    Insert into Employee values (3,\'john\',2500)
    Insert into Employee values (4,\'xavier\',5500)
    Insert into Employee values (5,\'steven\',7500)
    Insert into Employee values (6,\'susana\',2400)
    Go
    A simple query that can find the employee with the maximum salary, would be:

    Select * from Employee where salary = (Select max(Salary) from Employee)
    How does this query work?

    The SQL Engine evaluates the inner most query and then moves to the next level (outer query). So, in the above example inner query i.e. Select max(Salary) from Employee is evaluated first. This query will return a value of 7500 (based on the sample data shown as above). This value is substituted in the outer query and it is evaluated as:

    Select * from Employee where salary = (7500)
    Returns:

    Eid Name Salary
    5 steven 7500
    If the same syntax is applied to find out the 2nd or 3rd or 4th level of salary, the query would become bit complex to understand. See the example below:

    Select * from Employee where salary =
    (Select max(Salary) from Employee where salary
    < (Select max(Salary) from Employee where
    Salary < (Select max(Salary) from Employee where
    Salary <…………………………………………… N
    The above query would go on and on, depending on the level of salary that is to be determined. As mentioned earlier, the SQL Engine evaluates the inner most query first and moves the next outer level. One wouldn’t want to write such a big query just to find out this simple information.

    The same result can be achieved with a simple syntax and easily understandable logic, by using a CORRELATED SUBQUERY. This article doesn’t explain about correlated sub-query as it is out of scope of this article. (You may want to take a quick look on CORRELATED SUBQUERY.) As a \"Rule of Thumb\" keep these points in mind, when you use a correlated sub-query

    Correlated sub-query is a performance overhead to the database server and so, you have to use it only if it is required
    Avoid using Correlated subquery on large tables, as the inner query is evaluated for each row of the outer query
    Having said that, let’s look at the query that captures the Nth maximum value:

    Select * From Employee E1 Where
    (N-1) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where
    E2.Salary > E1.Salary)
    (Where N is the level of Salary to be determined)

    In the above example, the inner query uses a value of the outer query in its filter condition meaning; the inner query cannot be evaluated before evaluating the outer query. So each row in the outer query is evaluated first and the inner query is run for that row. Let’s look into the background process of this query, by substituting a value for N i.e. 4,(Idea is to find the 4th maximum salary):

    Select * From Employee E1 Where
    (4-1) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where
    E2.Salary > E1.Salary)
    Since the outer query’s value is referred in the inner query, the operation is done row-by-row. Based on the sample data as shown above, the process starts with the following record:

    Employee E1
    ----------------------------------
    Eid Name Salary
    1 harry 3500
    The salary of this record is substituted in the inner query and evaluated as:

    Select Count(Distinct(E2.Salary)) From Employee E2
    Where E2.Salary > 3500
    Above query returns 2 (as there are only 2 salaries greater than 3500). This value is substituted in the outer query and will be evaluated as:

    Select * From Employee E1 Where (4-1) = (2)
    The \"where\" condition evaluates to FALSE and so, this record is NOT fetched in the result.

    Next the SQL Engine processes the 2nd record which is:

    Employee E1
    ----------------------------------
    Eid Name Salary
    2 jack 2500
    Now the inner query is evaluated as:

    Select Count(Distinct(E2.Salary)) From Employee E2
    Where E2.Salary > 2500
    This query returns a value of 3 (as there are 3 salaries greater than 2500). The value is substituted in the outer query and evaluated as:

    Select * From Employee E1 Where (4-1) = (3)
    The \"where\" condition evaluates to TRUE and so, this record IS fetched in the result. This operation continues for all the remaining records. Finally the result shows these 2 records:

    Eid Name Salary
    2 jack 2500
    3 john 2500
    The above query works in the same manner in Oracle and Sybase as well. Applying the same logic, to find out the first maximum salary the query would be:

    Select * From Employee E1 Where
    (1-1) = (Select Count(Distinct(E2.Salary)) From Employee E2 Where
    E2.Salary > E1.Salary)

    If you are able to understand this functionality, you can workout various other queries in the same manner. The bottom line is, the query should be efficient and NOT resource hungry.


  3. #3
    tejinder is offline Junior Member Array
    Join Date
    Aug 2004
    Answers
    1
    select * from emp
    where sal in ( select min(sal) from
    (select sal from emp
    order by sal desc)
    where rownum <=2 )

    Try this and reply.


  4. #4
    karthigayini is offline Junior Member Array
    Join Date
    Sep 2007
    Answers
    2
    use a simple logic
    1st find the max sal of entire table
    2nd list all sal less than max sal
    3rd from that list find the max

    select * from table where salary>(select salary from table where salary <max(salary))


  5. #5
    tprabhuit's Avatar
    tprabhuit is offline Junior Member Array
    Join Date
    Dec 2007
    Location
    Coimbatore
    Answers
    14
    Hi,

    Below is a simple query to find the Nth Maximum / Minimum value of particular column.

    Nth Minimum
    SELECT * FROM <Table_Name> A
    WHERE N = (SELECT COUNT(DISTINCT B.Column_Name ) FROM <Table_Name> B WHERE A.Column_Name >= B.Column_Name)


    Where,
    N is integer
    A & B are alias for the Table

    Regards,
    Prabhu.T


  6. #6
    rkm2006 is offline Junior Member Array
    Join Date
    Dec 2007
    Answers
    1

    How To Access Oracle Application Forms

    HI ALL,
    IAM UNABLE TO ACCESS ORACLE APPLICATION FORMS CAN ANYBODY HELPME?

    THANKS AND REGARDS
    RANJAN KUMAR


  7. #7
    gouthami1970 is offline Junior Member Array
    Join Date
    May 2008
    Answers
    4

    Perform TOP N ANALYSIS

    HI vaibhav Top n analysis is used for knowing the top most ranks.The syntax goes like this modify acc to ur reqirement.

    select Rownum as rank,E.* from (select * from emp order by sal desc) where rownum<=2;

    Gouthami



    Quote Originally Posted by chandraismoon View Post
    Hi all
    I want to display the entire row of the employee who is havong second highest sal

    can any one help me

    Vaibhav



  8. #8
    prajapati is offline Junior Member Array
    Join Date
    May 2008
    Answers
    1

    For OpenSource Database MySQL

    If We are Using MySQL the we can use Limit as :

    SELECT <col name> FROM <table> order by <col name> DESC Limit (N-1), 1

    Where,
    N is integer eg. 3rd Max, 4th Max


    Regards,
    Pradeep Kumar Prajapati


  9. #9
    robalex is offline Junior Member Array
    Join Date
    Feb 2011
    Answers
    1

    Finding the second largest value

    select * from emp
    where sal < (select max(sal) from emp)
    and rownum <= 1
    order by sal desc



    try dis... it worked


    •    Sponsored Ads



Latest Article

Network Security Risk Assessment and Measurement

Read More...