Sql server 2008 r2 T-SQL在排除条件时获取最新日期

Sql server 2008 r2 T-SQL在排除条件时获取最新日期,sql-server-2008-r2,Sql Server 2008 R2,这应该很简单,但我正在努力 我的桌子: EmployeeID EmployeeType PayChangeDate 1 H 2/14/2012 1 H 3/8/2013 2 H 5/5/2012 2 H 6/6/2013 2 S 2/22/2014 我的问题是: SELECT EmployeeI

这应该很简单,但我正在努力

我的桌子:

EmployeeID EmployeeType PayChangeDate 1 H 2/14/2012 1 H 3/8/2013 2 H 5/5/2012 2 H 6/6/2013 2 S 2/22/2014 我的问题是:

SELECT EmployeeID , EmployeeType , MAX(PayChangeDate) AS CDate FROM EmployeesPayInfo GROUP BY EmployeeID , EmployeeType 我的结果是:

EmployeeID EmployeeType PayChangeDate 1 H 3/8/2013 2 H 6/6/2013 2 S 2/22/2014 问题是,我只想看到目前是H的员工。员工1很好,因为我只看到他最近的薪酬变化。员工2一开始是按小时计酬的,但现在有薪水了,所以我给他两次工资,而实际上我根本不想见他。如果我在H上过滤,我仍然会在2013年6月6日得到员工2


我看了看哪一张很接近,但由于它只返回一张记录,所以我没有看到。尽管他说答案不是他想要的,但他还是把它标为正确答案。我看到的所有解决方案都没有我需要的排除。如果这是重复的,我很抱歉,但是我的搜索没有找到我需要的答案。

为了只获取最后一个EmployeeType为的行,您可以加入每个员工最后日期的子查询。如果内部查询中的最后一个日期不是EmployeeTypeHt,则join将与行不匹配

SELECT
    EmployeesPayInfo.EmployeeID
  , EmployeeType
  , MAX(PayChangeDate) AS CDate
FROM  EmployeesPayInfo
INNER JOIN (
    SELECT
       EmployeeID
     , MAX(PayChangeDate) AS CDate
FROM  EmployeesPayInfo
GROUP  BY EmployeeID
) MAX_DATES ON EmployeesPayInfo.EmployeeID = MAX_DATES.EmployeeID 
           AND EmployeesPayInfo.PayChangeDate = MAX_DATES.CDate
WHERE  EmployeeType = 'H'
GROUP  BY EmployeesPayInfo.EmployeeID
        , EmployeeType
此查询将返回以下示例数据:

EmployeeID  EmployeeType CDate
----------- ------------ ----------
1           H            2013-03-08

这看起来很有希望,但并没有消除员工2。它以小时工的身份记录了他最近的工资变动日期,但它不应该这样做。我有三名员工开始是按小时计酬的,但改为按薪计酬的,此查询将收集所有员工。我没有代表对此进行投票,但它工作得很好,消除了所有当前领薪的员工。
SELECT A.EmployeeID
      ,A.EmployeeType
      ,A.PayChangeDate
FROM (
      SELECT * 
         ,ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY PayChangeDate DESC) rn 
      FROM EmployeesPayInfo
      WHERE EmployeeType = 'H'
     )A
WHERE A.rn = 1