SQL Server, как суммировать макс для конкретной категории? - PullRequest
0 голосов
/ 08 мая 2018

Возникла проблема при построении анализа SQL с использованием SQL Server

Необработанные данные, как показано ниже

GameID | UsrRegID | Score_User
281    | 1        | 1
281    | 1        | 2
281    | 1        | 3
282    | 1        | 0
282    | 1        | 0
282    | 1        | 1
283    | 1        | 2
283    | 1        | 3

Ниже приведен ожидаемый результат:

Distinct_Count_GameID | UsrRegID | Score_User
3                     | 1        | 7

Логика для вычисления Score_user, как показано ниже:

Сумма (Макс. (Score_user) для каждого GemeID)

Таким образом, результат должен быть 3 + 1 + 3 = 7.

Можно ли использовать чистый SQL для получения ожидаемого результата выше?

Ответы [ 5 ]

0 голосов
/ 08 мая 2018

Агрегаты и COUNT (Отличительный GameID):

declare @raw as table (GameID int, UsrRegID int, Score_user int)

insert into @raw values (281, 1, 1)
,(281, 1, 2)
,(281, 1, 3)
,(282, 1, 0)
,(282, 1, 0)
,(282, 1, 1)
,(283, 1, 2)
,(283, 1, 3)

select count(distinct GameID) as Distinct_Count_GameID, UsrRegID, sum(max_score_user) 
from
(
select GameID 
 , UsrRegID
 , max(score_user) as max_score_user
from @raw
group by GameID, UsrRegID
) a
group by a.UsrRegID
0 голосов
/ 08 мая 2018

Вы также можете попробовать следующее.

SELECT Count(DISTINCT [rgameid]) Distinct_Count_GameID, 
       Count(DISTINCT [usrregid]) UsrRegID, 
       (SELECT Sum(M) 
        FROM   (SELECT Max([score_user]) M 
                FROM   [TableName] 
                GROUP  BY [rgameid])t) AS Score_User 
FROM   [TableName] 

DEMO

0 голосов
/ 08 мая 2018

Вы не можете сделать агрегат агрегата на одном и том же SELECT, вы можете связать их вместе с CTE или подзапросами.

;WITH Maxs AS
(
    SELECT
        T.GameID,
        T.UsrRegID,
        MaxScore = MAX(T.Score_User)
    FROM
        YourTable AS T
    GROUP BY
        T.GameID,
        T.UsrRegID
)
SELECT
    M.UsrRegID,
    Distinct_Count_GameID = COUNT(DISTINCT(M.GameID)),
    Score_User = SUM(M.MaxScore)
FROM
    Maxs AS M
GROUP BY
    M.UsrRegID
0 голосов
/ 08 мая 2018

Я думаю, нам нужно объединиться здесь дважды. Один вариант использует ROW_NUMBER:

WITH cte AS (
    SELECT GameID, UsrRegID, Score_User,
        ROW_NUMBER() OVER (PARTITION BY GameID, UsrRegID ORDER BY Score_User DESC) rn
    FROM yourTable
)

SELECT
    UsrRegID,
    COUNT(DISTINCT GameID) AS Distinct_Count_GameID,
    SUM(Score_User) AS Score_User
FROM cte
WHERE rn = 1
GROUP BY
    UsrRegID;
0 голосов
/ 08 мая 2018

Сначала найдите максимальное значение для каждого GameId и UsrRegID, а затем найдите SUM() для столбца Score_User и сгруппируйте его по столбцам GameID и UsrRegID используя GROUP BY предложение.

Запрос

select count(distinct [t].[GameID]) as [GameID], [t].[UsrRegID], 
sum([t].[Score_User]) as [Score_User] from(
    select [GameID], [UsrRegID], max([Score_User]) as [Score_User]
    from [your_table_name]
    group by [GameID], [UsrRegID]
) as [t]
group by [t].[UsrRegID];

Или укажите номер строки в порядке убывания значения оценки и группы на GameID и UsrRegID. Затем найдите количество различных идентификаторов игр и сумму максимальных очков.

Запрос

;with cte as(
    select [rn] = row_number() over(
        partition by [GameID], [UsrRegID]
        order by [Score_User] desc
    ), *
    from [your_table_name]
)
select count(distinct [GameID]) as [GameID], [UsrRegID], 
sum([Score_User]) as [Score_User] from cte
where [rn] = 1
group by [UsrRegID];
...