2015-05-25 42 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