任何帮助将不胜感激。这是我的问题...... 我有一个表有类似的记录,但更新时间不同。例如 -
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的新手,这是踢我的屁股!
答案 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将在您提出要求时知道如何对其进行排序!