2015-05-25 92 views
1

我有一个表license_Usage凡就像一个日志许可证的使用情况在一天内返回最大值从SQL选择

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] 

WHI CH作品,但知道我想知道哪些用户已使用数量最多的许可证,为我做了以下查询:

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 top 1 * 
From (
    select count(license) as Quantity,[user],[date] 
    From license_Usage 
    Group by [date], [user] 
    ) as result 
order by Quantity desc 

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 

回答

2

您可以使用这样的事情如果有的话几个,那么你将不得不使用rank()窗口函数

+0

这工作,但我想知道为什么后续产生diferent值 选择的结果,MAX(许可证result.Quantity) 从( SELECT COUNT(许可)作为Quantiti y许可证,用户,日期 From license_Usage 按日期分组,用户 )作为结果 按结果分组。用户 – Eduardox23

+0

如果按用户分组,则每个用户将获得一行 - 这就是分组的目的,告诉你想要将结果分组到哪个级别。 –

0

使用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

SELECT * FROM (
    SELECT 
    LicPerDay.*, 
    RANK() OVER (PARTITION BY [date] ORDER BY Qty) AS User_Rank 
    FROM (
    SELECT 
     COUNT(license) AS Qty, 
     User, 
     [date] 
    FROM license_usage 
    GROUP BY User, [date] 
) LicPerDay 
) LicPerDayRanks 
WHERE User_Rank = 1 
0

使用窗式聚合函数,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