根据sql server中的最高版本从sql结果中获取前1个结果

时间:2013-05-15 21:38:24

标签: sql sql-server

我有一个基本查询,其中显示了他们正在使用的应用的用户名和版本列表:

Username AppVersion  Email           First Name
-------- ----------  -----           ----------
user1    2.3         user1@aol.com   User 1
user1    2.4         user1@aol.com   User 1
user1    2.5         user1@aol.com   User 1
user2    2.3         user2@aol.com   User 2
user2    2.4         user2@aol.com   User 2
user3    2.4         user3@aol.com   User 3
user3    2.5         user3@aol.com   User 3

我的SQL是:

SELECT TOP 100 LoginLog.SalesRepID, LoginLog.AppVersion FROM  LoginLog
GROUP BY LoginLog.SalesRepID, LoginLog.AppVersion
ORDER BY SalesRepID, LoginLog.AppVersion DESC

但我真正想从这个列表中找到用户所使用的应用程序的最新版本,所以我的结果真的是:

Username AppVersion  Email           First Name
-------- ----------  -----           ----------
user1  2.5         user1@aol.com   User 1
user2  2.4         user2@aol.com   User 2
user3  2.5         user3@aol.com   User 3

如何修改此查询以显示该类型的结果?

编辑:

我道歉,我在这里不够清楚 - 我试图简化我的问题而不应该。在这个例子中还有几个额外的列我遗漏了 - #FACEPALM

见上面的修改 - 对不起大家!!!

3 个答案:

答案 0 :(得分:4)

将公用表表达式与ROW_NUMBER

一起使用
WITH cte 
     AS (SELECT Username, 
                AppVersion, 
                RN = Row_number() 
                       OVER ( 
                         partition BY username 
                         ORDER BY Cast('/' + Replace(AppVersion, '.', '/') + '/' 
                       AS 
                       HIERARCHYID) 
                       DESC 
                       ) 
         FROM   loginlog) 
SELECT Username, AppVersion FROM  CTE
WHERE  RN = 1 
ORDER BY UserName

DEMO

此处版本排序的积分:

How Can I Sort A 'Version Number' Column Generically Using a SQL Server Query

答案 1 :(得分:2)

假设您的[AppVersion]列是字符串,我添加了一些转换。使用MAX()等聚合函数时,应从GROUP BY子句中排除这些列。另外,要以正确的顺序获取ORDER BY,同样的转换也应该包含在该子句中。

SELECT TOP 100 
    SalesRepID
   ,MAX(CONVERT(float, LoginLog.AppVersion))
FROM  
    LoginLog
GROUP BY 
    SalesRepID
ORDER BY 
    SalesRepID, CONVERT(float, LoginLog.AppVersion)

编辑如果应用程序版本号包含次要修订(例如3.4.2),则无效。在这种情况下,蒂姆的方法会更好。

答案 2 :(得分:0)

假设AppVersion是一个数字类型的字段,请使用MAX()函数,并仅在SalesRepIDs上进行分组:

SELECT TOP 100 LoginLog.SalesRepID, MAX(LoginLog.AppVersion)
FROM  LoginLog
GROUP BY LoginLog.SalesRepID
ORDER BY SalesRepID