此问题在此处已有答案:
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|
1条答案
按热度按时间q3aa05251#
使用
MAX
查找最新日期是正确的。查询不起作用的原因是需要查找多个最新数据。您需要每个雇员的最新日期。可以使用子查询来完成此操作:主查询将选择所有应显示的列,并按日期对其进行排序,从最新日期开始。子查询将查找每个雇员的最新日期。主查询的
WHERE
子句将确保只选择日期与当前雇员的最新日期匹配的条目。因此,结果将与请求的完全相同。此查询将在每个DB类型上执行,因为它不包含DB类型特定的语法。
除了这个常规选项之外,公共DB还提供了窗口函数,如
RANK
,这些函数使这些东西“独立”。此查询的结果将相同。
子查询中的
PARTITION BY
子句将按雇员对数据进行分组,ORDER BY
子句将按日期对数据进行排序,从最新日期开始。主查询的WHERE
子句将仅从子查询中获取排序列表中具有最新日期的数据。由于窗口函数的语法和命名通常不同,并且较早的DB版本可能不提供这些功能,因此不会对每种DB类型执行此查询。
这将是上述两个查询的结果:
| 部门ID|所属部门|员工ID|额定值|费率修改日期|
| - -|- -|- -|- -|- -|
| 十六|行政人员|二百三十四|六十零九六二|2012年1月29日|
| 十六|行政人员|一个|十二万五千|2009年1月14日|
请在此处试用:db<>fiddle