我有一个名为employee_salary
的表格,其中有三列:empsal_id
,empsal_name
和empsal_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,我必须在一次查询中执行此操作。
答案 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