SQL Server 如何获取每条记录的最新日期?[duplicate]

yeotifhr  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(153)

此问题在此处已有答案

Retrieving last record in each group from database - SQL Server 2005/2008(2个答案)
Get top 1 row of each group(19个答案)
14天前关闭。
我在SQL Server中有此表:
| 部门ID|所属部门|员工ID|费率|费率修改日期|
| - -|- -|- -|- -|- -|
| 十六|行政人员|二百三十四|39.0600欧元|2009年01月31日上午10时00分|
| 十六|行政人员|二百三十四|四十八点五五七七|2011年11月14日上午10:00:00|
| 十六|行政人员|二百三十四|六十零九六二|2012年01月29日上午10时00分|
| 十六|行政人员|一个|十二万五千|2009年01月14日上午10:00:00|
我需要每个员工的最新RateModifiedDate,如下所示:
| 部门ID|所属部门|员工ID|费率|费率修改日期|
| - -|- -|- -|- -|- -|
| 十六|行政人员|二百三十四|六十零九六二|2012年01月29日上午10时00分|
| 十六|行政人员|一个|十二万五千|2009年01月14日上午10:00:00|

q3aa0525

q3aa05251#

使用MAX查找最新日期是正确的。查询不起作用的原因是需要查找多个最新数据。您需要每个雇员的最新日期。可以使用子查询来完成此操作:

SELECT DepartmentID, Department, EmployeeID, rate, RateModifiedDate
  FROM yourtable y1
 WHERE RateModifiedDate =
       (SELECT MAX(y2.RateModifiedDate)
          FROM yourtable y2
         WHERE y1.EmployeeID = y2.EmployeeID)
 ORDER BY RateModifiedDate DESC;

主查询将选择所有应显示的列,并按日期对其进行排序,从最新日期开始。子查询将查找每个雇员的最新日期。主查询的WHERE子句将确保只选择日期与当前雇员的最新日期匹配的条目。因此,结果将与请求的完全相同。
此查询将在每个DB类型上执行,因为它不包含DB类型特定的语法。
除了这个常规选项之外,公共DB还提供了窗口函数,如RANK,这些函数使这些东西“独立”。

SELECT DepartmentID, Department, EmployeeID, rate, RateModifiedDate
  FROM (SELECT DepartmentID,
               Department,
               EmployeeID,
               rate,
               RateModifiedDate,
               RANK() OVER(PARTITION BY EmployeeID ORDER BY RateModifiedDate DESC) dest_rank
          FROM yourtable) sub
 WHERE dest_rank = 1
 ORDER BY RateModifiedDate DESC;

此查询的结果将相同。
子查询中的PARTITION BY子句将按雇员对数据进行分组,ORDER BY子句将按日期对数据进行排序,从最新日期开始。主查询的WHERE子句将仅从子查询中获取排序列表中具有最新日期的数据。
由于窗口函数的语法和命名通常不同,并且较早的DB版本可能不提供这些功能,因此不会对每种DB类型执行此查询。
这将是上述两个查询的结果:
| 部门ID|所属部门|员工ID|额定值|费率修改日期|
| - -|- -|- -|- -|- -|
| 十六|行政人员|二百三十四|六十零九六二|2012年1月29日|
| 十六|行政人员|一个|十二万五千|2009年1月14日|
请在此处试用:db<>fiddle

相关问题