获取2个类似记录的最新日期时间,仅显示最新的

时间:2014-03-17 23:02:46

标签: sql tsql

任何帮助将不胜感激。这是我的问题...... 我有一个表有类似的记录,但更新时间不同。例如 -

ID          ComputerName    DomainName  OSType       LastUpdate
12345   PC1111          WORK        Windows7         Mar  5 2014 10:24PM
1723    PC1111          WORK        Windows7         Mar 15 2014  8:30PM
23455       PC1111          WORK        Windows7         Mar 17 2014  8:44PM

pc名称相同,但我可以使用ID和LastUpdate返回最新的LastUpdate时间。我试过MAX(LastUpdate),但没有好处。我试过TOP 1但仍然没有好处。我仍然是T-SQL的新手,这是踢我的屁股!

4 个答案:

答案 0 :(得分:3)

你可以在row_number使用cte:

WITH CTE AS
(
    SELLECT ID, ComputerName, DomainName, OSType, LastUpdate,
       rn = row_number() over (partition by ComputerName order by LastUpdate desc)
    FROM dbo.TableName
)
SELECT ID, ComputerName, DomainName, OSType, LastUpdate
FROM CTE
WHERE RN = 1

答案 1 :(得分:1)

SELECT * 
FROM
 (
 SELECT *, ROW_NUMBER() OVER (PARTITION BY ComputerName ORDER BY LastUpdate DESC) AS RN
 FROM Table_NAME
 )Q
WHERE rn = 1

使用此查询,返回的结果集将具有额外的列RN。只需在select语句中明确使用列名称选择所需的列。

要了解有关RANKING函数的更多信息,请阅读SQL SERVER RANKING FUNCTIONS

答案 2 :(得分:0)

作为加入:

“查找计算机更新,我们无法找到具有相同名称和更新时间的计算机的其他更新”

SELECT    c1.*
FROM      computers c1
LEFT JOIN computers c2
ON        c1.name = c2.name
AND       c1.lastUpdate > c2.lastUpdate
WHERE     c2.id IS NULL

或使用相关子查询:

“获取具有相同名称的计算机的所有其他更新的最大更新时间的计算机更新。”

SELECT    c1.*
FROM      computers c1
WHERE     c1.lastUpdate = (
             SELECT max(c2.lastUpdate)
             FROM   computers c2
             WHERE  c2.name = c1.name
          )

答案 3 :(得分:-1)

这取决于列的数据类型!如果将LastUpdate声明为datetime \ smalldatetime等命令并选择top 1应该有效。如果它被声明为某种字符串,那么它将根据字符串值进行排序,这可能是你得到的。

select Max(convert(datetime, LastUpdate, 103))
from Table

select Top 1 LastUpdate
from Table
order by convert(datetime, date, 103) ASC

以上两个示例将您的字符串转换为日期数据类型。这意味着SQL Server将在您提出要求时知道如何对其进行排序!