从SQL选择返回最大值
我确实有一个表license\u Usage,其中的工作方式类似于一天中许可证使用情况的日志从SQL选择返回最大值,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我确实有一个表license\u Usage,其中的工作方式类似于一天中许可证使用情况的日志 ID User license date 1 1 A 22/2/2015 2 1 A 23/2/2015 3 1 B 22/2/2015 4 2 A 22/2/2015 如果我想计算每天每个用户有多少个许可证,结果应该如下所示:
ID User license date
1 1 A 22/2/2015
2 1 A 23/2/2015
3 1 B 22/2/2015
4 2 A 22/2/2015
如果我想计算每天每个用户有多少个许可证,结果应该如下所示:
QuantityOfLicenses User date
2 1 22/2/2015
1 2 22/2/2015
为此,我进行了以下查询:
select count(license) as [Quantity of licenses],[user],[date]
From license_Usage
where date = '22/2/2015'
Group by [date], [user]
哪个可行,但我想知道哪个用户使用了最多数量的许可证,为此我进行了以下查询:
select MAX(result.[Quantity of licenses])
From (
select count(license) as [Quantity of licenses],[user],[date]
From license_Usage
Group by [date], [user]
) as result
它返回的最大值为2,但当我想知道哪个用户使用了2个许可证时,我尝试此查询但没有成功:
select result.user, MAX(result.[Quantity of licenses])
From (
select count(license) as [Quantity of licenses],[user],[date]
From license_Usage
Group by [date], [user]
) as result
Group by result.user
您可以使用以下内容:
select top 1 *
From (
select count(license) as Quantity,[user],[date]
From license_Usage
Group by [date], [user]
) as result
order by Quantity desc
如果您需要一个fetch来获取具有max的所有行(如果有多行),那么您必须使用rank窗口功能使用rank根据每天的许可证数量对用户进行排名
SELECT
LicPerDay.*,
RANK() OVER (PARTITION BY [date] ORDER BY Qty DESC) AS User_Rank
FROM (
SELECT
COUNT(license) AS Qty,
User,
[date]
FROM license_usage
GROUP BY User, [date]
) LicPerDay
任何user_Rank=1的用户将拥有当天最多的许可证
如果您每天只需要排名靠前的用户,请将上面的查询包装为子查询,并在user_Rank=1上进行筛选:
使用窗口聚合函数RANK获得最高计数:
SELECT * FROM (
SELECT
User,
[date]
COUNT(license) AS Qty,
-- rank by descending number for each day ??
--RANK() OVER (PARTITION BY [date] ORDER BY COUNT(license) DESC) AS rnk
-- rank by descending number
RANK() OVER (ORDER BY COUNT(license) DESC) AS rnk
FROM license_usage
GROUP BY User, [date]
) dt
WHERE rnk = 1
这是可行的,但我想知道为什么下面的命令会产生一个不同的值select result,MAXresult。select COUNT的许可数量许可数量许可数量,用户,日期从许可证\u使用组按日期,用户作为结果组按结果。用户如果您有组按用户,您将为每个用户获得一行—这就是分组的目的,告诉您希望将结果分组到哪个级别。
SELECT * FROM (
SELECT
User,
[date]
COUNT(license) AS Qty,
-- rank by descending number for each day ??
--RANK() OVER (PARTITION BY [date] ORDER BY COUNT(license) DESC) AS rnk
-- rank by descending number
RANK() OVER (ORDER BY COUNT(license) DESC) AS rnk
FROM license_usage
GROUP BY User, [date]
) dt
WHERE rnk = 1