Sql 正在查找检索特定记录

Sql 正在查找检索特定记录,sql,tsql,Sql,Tsql,我有按员工、地点和上次更新的多个LPLE记录,我只需要为每个员工选择一个具有Max(上次更新)的记录 employee location lastupdated 59 All locations 2017-10-23T15:44:53 12 Payroll and Benefits 2017-10-23T06:26:44 13 North York 2017-10-26T09:41:52 13 East York 2017-10-06T12:05:40 13

我有按员工、地点和上次更新的多个LPLE记录,我只需要为每个员工选择一个具有Max(上次更新)的记录

employee    location    lastupdated
59  All locations   2017-10-23T15:44:53
12  Payroll and Benefits    2017-10-23T06:26:44
13  North York  2017-10-26T09:41:52
13  East York   2017-10-06T12:05:40
13  North York  2017-10-18T14:25:36
14  CEO     2017-10-26T09:45:58
14  DownTown    2017-08-01T16:44:54
15  Energey 2017-10-24T08:22:35
15  Smart Buildings 2017-10-25T19:59:53
例如,应返回以下记录:

    59  All locations   2017-10-23T15:44:53
    12  Payroll and Benefits    2017-10-23 T06:26:44
    13  North York  2017-10-26T09:41:52
    14  CEO 2017-10-26T09:45:58
    15  Smart Buildings 2017-10-25T19:59:53


SELECT employee, location, max(lastupdated)
FROM employee
GROUP BY employee, location;

这不起作用,因为“最大日期”是根据员工和地点选择的,我只想选择一条记录,“最大日期”(LastUpdate),该记录应包含员工、地点和LastUpdate字段。

有几种解决方案:

SELECT TOP 1 employee, location, lastupdated
FROM employee
ORDER BY lastupdated DESC
这将始终返回1条记录,如果有平局,它将只选择一条。这可能不是你想要的。如果需要领带,可以指定
选择带领带的顶部(1)[…]

或者:

SELECT employee, location, lastupdated
FROM employee
WHERE lastupdated = (SELECT MAX(lastupdated) FROM employee)
在这里,您将始终获得所有的平局,因此在平局的情况下,您可能会获得多个记录。同样,这可能不是你想要的


鉴于你的最新问题:

;WITH CTE AS (
    SELECT employee,
        location,
        lastupdated, 
        ROW_NUMBER() OVER (PARTITION BY employee ORDER BY lastupdated DESC) rn
    FROM employee
)
SELECT employee, location, lastupdated
FROM CTE
WHERE rn = 1;

这是“每组最大N”的问题。这是典型的解决方案(MySQL除外)。如果要包括领带,则应使用
RANK()
densite\u RANK()
分析函数,而不是
ROW\u NUMBER()

有几种解决方案:

SELECT TOP 1 employee, location, lastupdated
FROM employee
ORDER BY lastupdated DESC
这将始终返回1条记录,如果有平局,它将只选择一条。这可能不是你想要的。如果需要领带,可以指定
选择带领带的顶部(1)[…]

或者:

SELECT employee, location, lastupdated
FROM employee
WHERE lastupdated = (SELECT MAX(lastupdated) FROM employee)
在这里,您将始终获得所有的平局,因此在平局的情况下,您可能会获得多个记录。同样,这可能不是你想要的


鉴于你的最新问题:

;WITH CTE AS (
    SELECT employee,
        location,
        lastupdated, 
        ROW_NUMBER() OVER (PARTITION BY employee ORDER BY lastupdated DESC) rn
    FROM employee
)
SELECT employee, location, lastupdated
FROM CTE
WHERE rn = 1;

这是“每组最大N”的问题。这是典型的解决方案(MySQL除外)。如果您想包括领带,那么您应该使用
RANK()
densite\u-RANK()
分析函数,而不是
ROW\u-NUMBER()

完美,非常感谢。这个问题得到了回答。嗨,穆罕默德。根据我的另一条消息。在这里,接受答案不是强制性的,但这有点像说“谢谢”——这给了乐于助人的人一些互联网点数,感谢他们提供的帮助。太好了,非常感谢。这个问题得到了回答。嗨,穆罕默德。根据我的另一条消息。在这里,接受答案不是强制性的,但这有点像说“谢谢”——这会给乐于助人的人一些互联网点数,以感谢他们所提供的帮助。