2

我有一个基本查询,我在其中看到他们正在使用的应用程序的用户名和版本列表:

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

请参阅上面的修订版 - 对不起大家!!!

4

3 回答 3

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

演示

版本的学分在这里排序:

如何一般使用 SQL Server 查询对“版本号”列进行排序

于 2013-05-15T21:41:30.417 回答
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如果应用程序版本号包括次要修订(例如),这将不起作用。在这种情况下,蒂姆的方法会更有效。

于 2013-05-15T21:41:22.577 回答
0

假设 AppVersion 是数字类型字段,使用 MAX() 函数,并仅对 SalesRepID 进行分组:

SELECT TOP 100 LoginLog.SalesRepID, MAX(LoginLog.AppVersion)
FROM  LoginLog
GROUP BY LoginLog.SalesRepID
ORDER BY SalesRepID
于 2013-05-15T21:40:53.090 回答