1

我有一张这样的桌子

PkReferencesID    FkReferencesID   DocID    FKHRSEmployeeID  AssignedDate  AssignedTime  FKActivityID
40855             NULL             8530     13               13920625      0829          1
40856             40855            8530     438              13920625      0829          1
40857             40856            8530     13               13920625      0829          2
40858             40857            8530     438              13920625      0830          1
40859             40858            8530     NULL             13920625      0830          1
NULL              NULL             NULL     NULL             NULL          NULL          NULL 

我如何为每个 FKHRSEmployeeID 选择 DocID = 8530 和 FKActivityID = 1 以及 Maximum AssignedDate 和 Maximum AssignedTime 的行?

注意:结果应该是每个 FKHRSEmployeeID 的一行

任何帮助都将不胜感激。谢谢

结果一定是这样的

PkReferencesID FkReferencesID DocID FKHRSEmployeeID AssignedDate AssignedTime FKActivityID

40855 空 8530 13 13920625 0829 1 40858 40857 8530 438 13920625 0830 1

4

2 回答 2

2

最简单的方法是使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by FKHRSEmployeeID
                                order by AssignedDate desc, AssignedTime desc
                               ) as seqnum
      from t
      where DocID = 8530 and FKActivityID = 1 
     ) t
where seqnum = 1
于 2013-09-16T11:33:21.477 回答
0

查询 2 将检索您要求的信息:

Query1:此查询获取每个员工的最大分配日期/时间。

SELECT FKHRSEmployeeID, MAX(AssignedDate & AssignedTime)
FROM Table
WHERE T.DocID=8530 
  AND T.FKActivityID=1
GROUP BY FKHRSEmployeeID;

Query2:这个查询使用前一个来只检索匹配的记录。

SELECT T.*
FROM Table AS T 
  INNER JOIN Query1 AS Q 
    ON (T.Date=LEFT(Q.MaxDateTime,8)) 
    AND (T.Time=RIGHT(Q.MaxDateTime,4)) 
    AND (T.FKHRSEmployeeID=Q.FKHRSEmployeeID)
WHERE T.DocID=8530 
  AND T.FKActivityID=1;

此查询本身并不能保证您只会获得每位员工的一条记录,除非 FKHRSEmployeeID/AssignedDate/AssignedTime 组合在表中是唯一的。您可以通过基于这些列创建唯一索引来确保这一点。

于 2013-09-16T11:20:05.617 回答