这是我要查询的表:
EmployeeId, Salary, Date
8, 500, 2016-11-02
8, 500, 2016-09-21
8, 500, 2016-10-18
9, 500, 2016-10-18
9, 500, 2016-09-21
9, 500, 2016-11-02
10, 1000, 2016-11-02
10, 700, 2016-09-21
我想选择一个雇员列表,以及该雇员最新的薪水。对于样本数据,日期是同一日期(11-02),但不一定如此。我的查询:
SELECT EmployeeId, Salary, MAX(Date)
FROM table
GROUP BY EmployeeId. Salary
ORDER BY EmployeeId
哪个正在返回:
8, 500, 2016-11-02
9, 500, 2016-11-02
10, 700, 2016-09-21
10, 1000, 2016-11-02
我的预期输出是:
8, 500, 2016-11-02
9, 500, 2016-11-02
10, 1000, 2016-11-02
如果我没有薪水合计,那么我会得到预期的结果,但是我需要使薪水可见。有没有办法在聚合后包括它?
在使用窗口功能之前(因为并非所有的RDBMS版本都支持它们),您需要使用内联视图来完成。
首先考虑您的需求:
为了实现第一个目标,我们确实生成了一个内联视图(以下简称为“ B”)。然后,我们返回到基本集以检索其他所需信息;允许内部联接消除不需要的记录;并完全排除了外部查询对分组依据的需求。
SELECT A.EmployeeId, A.Salary, A.Date
FROM table A
INNER JOIN (SELECT max(date) mDate, EmployeeID
FROM table
GROUP BY EmployeeID) B
on A.EmployeeID = B.EmployeeID
and A.Date = B.MDate
ORDER BY EmployeeId
与RDBMS一起使用时,请考虑数据集以及如何过滤这些数据集并将其重新组合在一起以实现所需的结果。对大多数(不是全部)RDBMS活动进行基于集合的处理将是最有效的。通过引入窗口函数(又称分析函数),可以在没有子查询的情况下完成集合的生成。使它们在数据分析中具有强大的功能;尽管开始时会遇到困难。
那到底ROW_NUMBER() OVER (PARTITION BY EmployeeId ORDER BY Date DESC) RN
是什么呢?
它为每个遇到的新员工(分区)从1开始分配行号(降序)(因此,每个员工的最新日期的RN始终为1!)。但是,该1对查询不可用在where子句中作为操作的SQL顺序生成选择值LAST(因此where子句已经执行)。这意味着要使窗口函数达到期望的结果并限制RN = 1,您必须将其包装在子查询中,然后才能访问RN = 1,从而仅返回具有最新日期的员工的记录。由于RDBMS能够独立于分析功能执行表的生成,因此RDBMS可以同时处理它们并非常快速地提供响应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句