简体   繁体   中英

How to average the top n in each SQL group

I'm trying to figure out how to average the top N values within each group. I have a table with two columns, Group and Value. My goal is to average the top N values within each group where N is different based on another table.

For group A, N equals 3 and is highlighted in red. The output is the average of the top 3 values.

For group B, N equals 2 and is highlighted in green. Because we only have 1 value of 2.2 for group B, we need to go to the filler table. The filler value for group B is 2.0, so we will average 2.2 and 2.0. If N = 5, then the filler value will be repeated 4 times for Group B.

My initial idea is to:

  1. Rank the values in each group

  2. Join it to the second table

  3. Use where Rank <= N to remove the duplicates before averaging

However, I not sure how the filling table could be incorporated since N could be greater than the number of values I have. I do need to use SQL Server 2008.

在此处输入图片说明

First of all, I hope that you're using more adequate names instead of Group and Value. Here's a sample code that first defines the order to later define the N values that will be used and get an average from those. The code is untested as you didn't provide consumable sample data.

WITH CTE AS(
    SELECT *,
        ROW_NUMBER() OVER( PARTITION BY [Group] ORDER BY [Value] DESC) AS rn,
        COUNT(*) OVER( PARTITION BY [Group]) ItemCount
    FROM TableWithValues
)
SELECT [Group],
    (SUM( [Value]) + CASE WHEN N.n > c.ItemCount 
                           THEN (N.n - c.ItemCount) * F.Filler
                           ELSE 0 END)/ N.n AS [Value]
FROM CTE c
JOIN TableWithN N ON c.[Group] = N.[Group] AND c.rn <= N.n
JOIN Fillers F ON c.[Group] = F.[Group]
GROUP BY [Group];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM