从SQL选择返回最大值

从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 如果我想计算每天每个用户有多少个许可证,结果应该如下所示:

我确实有一个表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
如果我想计算每天每个用户有多少个许可证,结果应该如下所示:

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