我有一个基本查询,其中显示了他们正在使用的应用的用户名和版本列表:
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
见上面的修改 - 对不起大家!!!
答案 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
此处版本排序的积分:
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