Как усреднить верхние n в каждой группе SQL - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь выяснить, как усреднить верхние значения N в каждой группе.У меня есть таблица с двумя столбцами, Группа и Значение.Моя цель - усреднить верхние значения N в каждой группе, где N отличается на основе другой таблицы.

Для группы A N равно 3 и выделяется красным.Выходное значение является средним из трех верхних значений.

Для группы B N равно 2 и выделяется зеленым цветом.Поскольку у нас есть только 1 значение 2,2 для группы B, нам нужно перейти к таблице заполнителей.Значение наполнителя для группы B составляет 2,0, поэтому мы в среднем составим 2,2 и 2,0.Если N = 5, то значение заполнителя будет повторяться 4 раза для группы B.

Моя первоначальная идея заключается в следующем:

  1. Ранжирование значений в каждой группе

  2. Присоединить его ко второму столу

  3. Использовать где Rank <= N, чтобы удалить дубликаты перед усреднением </p>

Однако я не уверен, как можно включить таблицу заполнения, поскольку N может быть больше, чем число значений, которые у меня есть.Мне нужно использовать SQL Server 2008.

enter image description here

1 Ответ

0 голосов
/ 01 мая 2019

Прежде всего, я надеюсь, что вы используете более подходящие имена вместо Group и Value. Вот пример кода, который сначала определяет порядок, чтобы позже определить N значений, которые будут использоваться, и получить среднее из них. Код не проверен, так как вы не предоставили данные образца расходных материалов.

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...