首页 > 解决方案 > 查找工资率的最新日期

问题描述

也有人提出了类似的问题,但我仍然希望得到一些澄清。我一直在 SQL 上使用 AdventureWorks2017 包,我打算得到 290 行作为我的答案。然而,使用下面的代码,我一直在努力实现这一目标,但我的成功率很低。

SELECT a.[NationalIDNumber], a.[Gender], b.[Rate], b.RateChangeDate, b.[PayFrequency], a.[BusinessEntityID], b.[ModifiedDate]
FROM [AdventureWorks2017].[HumanResources].[Employee] a
INNER JOIN [AdventureWorks2017].[HumanResources].[EmployeePayHistory] b ON a.[BusinessEntityID] = b.[BusinessEntityID]
AND b.RateChangeDate = MAX(b.RateChangeDate)
ORDER BY BusinessEntityID

我的目标本质上是这样的:我想找到员工的最新工资率。我尝试了一些不同类型的查询来获得我想要的答案,但通常我得到 277 或 316 行(当我应该得到 290 时)。我尝试找到RateChangeDate最大值Rate最大值,但没有成功。我要修改的主线是以“AND”开头的主线。任何帮助都会很棒!

这里还有一个 AdventureWorks2008 的模式(虽然它不是 2017 年),以防需要一些明确性。

AdventureWorks 2008 Schema(不是 2017 - 我正在使用的那个) 在此处输入图像描述

标签: sqlsql-serveradventureworks

解决方案


您可以对 EmployeePayHistory 表进行分区,按日期降序排列,然后选择最近的作为内部联接的一部分。

    SELECT a.[NationalIDNumber], a.[Gender], b.[Rate], b.[RateChangeDate], b.[PayFrequency], a.[BusinessEntityID], b.[ModifiedDate]
    FROM [AdventureWorks2017].[HumanResources].[Employee] a
    INNER JOIN (Select ROW_NUMBER() OVER (PARTITION BY eph.[BusinessEntityID] ORDER BY eph.[RateChangeDate] DESC) AS 'PayOrderDesc'
                        , eph.*
                FROM [AdventureWorks2017].[HumanResources].[EmployeePayHistory] eph) b 
        ON a.[BusinessEntityID] = b.[BusinessEntityID]
        and b.PayOrderDesc = 1
    ORDER BY BusinessEntityID



推荐阅读