如何在sqlserver中获取顶级不同的数据

时间:2012-01-07 11:37:25

标签: sql sql-server sql-server-2008

我有一个名为employee_salary的表格,其中有三列:empsal_idempsal_nameempsal_sal。数据如下:

empsal_id   empsal_name   empsal_sal

1           dilip         14000
2           santosh       20000
3           amit          32000
4           dilip         22000
5           amit          38000
6           santosh       25000
7           dilip         30000     

empsal_id是一个标识列,其种子和增量为1,并且是主键。我想要返回每位员工的姓名和当前工资。工资可以减少也可以增加,因此当前并不一定意味着最高。

所以我需要以下输出:

empname     emp_sal
dilip       30000
amit        38000
santosh     25000

我使用的是Microsoft SQL Server,我必须在一次查询中执行此操作。

4 个答案:

答案 0 :(得分:2)

此查询将返回每位员工及其最高薪水:

    SELECT
        empsal_name, MAX(empsal_sal)
    FROM
        employee
    GROUP BY
        empsal_name

此查询将返回每位员工及其当前工资(即具有最高empsal_id的工资:

    SELECT
        empsal_name, empsal_sal
    FROM
        employee e1
    WHERE
        empsal_id =
            (SELECT MAX(empsal_id)
             FROM employee e2
             WHERE e1.empsal_name=e2.empsal_name)

就我个人而言,我认为您最好使用有效的日期列(例如empsal_effectivedate)来确定哪条记录是最新的,因此此查询将返回每位员工及其当前薪水(即假设有empsal_effectivedate字段:

,最近empsal_effectivedate)的工资
    SELECT
        empsal_name, empsal_sal
    FROM
        employee e1
    WHERE
        empsal_effectivedate =
            (SELECT MAX(empsal_effectivedate)
             FROM employee e2
             WHERE e1.empsal_name=e2.empsal_name)

答案 1 :(得分:1)

SELECT empname, MAX(emp_sal) 
FROM   employee
GROUP BY  empname

更新:

SELECT DISTINCT EmpA.empname, 
                EmpA.emp_sal
FROM Employee AS EmpA 
     INNER JOIN ( SELECT  EmpName, MAX(recID) AS recid 
                  FROM Employee 
                  GROUP BY EmpName
                ) AS EmpB ON EmpA.recid = EmpB.recid;

答案 2 :(得分:1)

假设表中还有一个ID,并且假设这个ID越大,那么该员工的工资就越近

SELECT DISTINCT
    e.empname,
    (SELECT TOP 1 
        emp_sal 
    FROM 
        employee s
    WHERE 
        s.empname = e.empname 
    ORDER BY 
        recid DESC) AS emp_sal
FROM
    employee e

还假设empname对于员工来说是唯一的


因为有许多假设 :您应该发布表格的所有列及其含义......

答案 3 :(得分:0)

您需要一个日期字段来确定最新插入的行。如果表链接到其他具有日期列的表。那么它很容易获取当前数据。 例如

    Employee Table 
    {
    EmpName varchar(30) PK,
    EmpAddress varchar(255) ,
    Company varchar(30),
    CurrentTimeStamp Datetime
    }

    Salary Table 
    {
    EmpName varchar(30) FK,
    EmpSalary int
    }

要获取最新记录,请使用CTE功能

    With LatestSal(EmpName ,EmpSalary)
    AS
    (
    Select row_number() over (PARTITION BY b.[EmpName], order by CurrentTimestamp DESC) as seq
    b.EmpName,b.EmpSalary
    From Employee as a,
    Salary as b
    on a.[EmpName]=b.[EmpName]
    ) 
    Select EmpName,EmpSalary 
    from LatestSal
    where seq=1