Сгруппировать по двум столбцам, взять сумму, затем максимум - PullRequest
0 голосов
/ 01 октября 2019

Существует три столбца: Id (char), Name (char) и Score (int).

Сначала мы группируем по Id и Name и добавляемScore для каждой группы. Давайте назовем добавленную оценку total_score.

Затем мы группируем по Name и берем только максимум total_score и его соответствующие Id и Name. У меня есть все остальное, но мне трудно понять, как получить Id. Я получаю сообщение об ошибке:

Недопустимый столбец Id в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

WITH Tmp AS
  (SELECT Id,
          Name,
          SUM(Score) AS total_score
   FROM Mytable
   GROUP BY Id,
            Name)
SELECT Name,  -- Id,
       MAX(total_score) AS max_score
FROM Tmp
GROUP BY Name
ORDER BY max_score DESC

Ответы [ 6 ]

2 голосов
/ 01 октября 2019
WITH Tmp AS
  (SELECT Id,
          Name,
          SUM(Score) AS total_score
   FROM Mytable
   GROUP BY Id,
            Name)
SELECT Name,   Id,
       MAX(total_score) AS max_score
FROM Tmp
GROUP BY Name,id
ORDER BY max_score DESC

Попробуйте это. Надеюсь, это поможет.

1 голос
/ 01 октября 2019

Вы можете выбрать DENSE_RANK () в столбце total_score, а затем выбрать записи в Rank = 1. Это будет работать и для тех, у кого несколько Name имеют одинаковые total_score.

WITH Tmp AS
  (SELECT Id,
          Name,
          SUM(Score) AS total_score
   FROM Mytable
   GROUP BY Id, Name)
SELECT Id, 
       Name,
       total_score AS max_score
FROM (SELECT Id, 
           Name,
           total_score,
           DENSE_RANK() OVER (PARTITION BY Name ORDER BY total_score DESC) AS Rank
    FROM Tmp) AS Tmp2
WHERE Rank = 1
1 голос
/ 01 октября 2019

просто добавьте row_number() раздел по Name к вашему запросу и получите 1-ую строку (порядок по total_score по убыванию)

select  *
from
(
    -- your existing `total_score` query
    SELECT  Id, Name,
            SUM(Score) AS total_score,
            r = row_number() over (partition by Name order by SUM(Score) desc)
    FROM  Mytable
    GROUP BY Id, Name
) d
where   r = 1
1 голос
/ 01 октября 2019
WITH Tmp AS
 (
 SELECT Id,
          Name,
          SUM(Score) AS total_score
   FROM Mytable
   GROUP BY Id,
            NAME
 )
SELECT Name,   Id,
       MAX(total_score) AS max_score
FROM Tmp
GROUP BY Name,id
ORDER BY max_score DESC

Примечание: - Если мы используем функцию агрегирования, то мы должны использовать другой столбец в качестве группы по ....

В вашем случае вы используете SUM (Score) в качестве функции агрегирования, тогда мыиспользовать другой столбец в качестве группы по ...

1 голос
/ 01 октября 2019

Я не уверен в производительности нижеуказанного запроса, но мы можем использовать window functions, чтобы получить maximum значение из данных partition.

SELECT
        Id,
        Name,
        SUM(Score) AS total_score,
        MAX(SUM(Score)) OVER(Partition by Name) AS max_score
FROM Mytable
GROUP BY Id, Name;

Протестировано -

declare @Mytable table (id int, name varchar(10), score int);
insert into @Mytable values
(1,'abc', 100),
(2,'abc', 200),
(3,'def', 300),
(3,'def', 400),
(4,'pqr', 500);

Вывод -

Id  Name   total_score  max_score
1   abc    100          200
2   abc    200          200
3   def    700          700
4   pqr    500          500
0 голосов
/ 01 октября 2019

Вы также можете попробовать это:

select id,name,max(total_score) over (partition by name)  max_score from (
select id,name,sum(score) as total_score from YOURTABLE
group by id,name
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...