[英]Group by two columns, take sum, then max
共有三列: Id
(char)、 Name
(char) 和Score
(int)。
首先,我們按Id
和Name
分組,並為每個組添加Score
。 讓我們將添加的分數total_score
。
然后,我們按Name
分組,只取total_score
及其對應的Id
和Name
的最大值。 我擁有其他一切,但我很難弄清楚如何獲得Id
。 我得到的錯誤是
select 列表中的“Id”列無效,因為它不包含在聚合 function 或 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
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
嘗試這個。 希望這會有所幫助。
我不確定以下查詢的性能,但我們可以使用window functions
從數據partition
中獲取maximum
。
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);
Output -
Id Name total_score max_score
1 abc 100 200
2 abc 200 200
3 def 700 700
4 pqr 500 500
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
注意:- 如果我們使用聚合 function 那么我們必須使用其他列作為 Group By....
在您的情況下,您使用 SUM(Score) 作為聚合 function 然后我們使用其他列作為 Group by...
只需按Name
將row_number()
分區添加到您的查詢中並獲取第一行(按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
您可以 select DENSE_RANK()使用total_score
列,然后使用 select 記錄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
你也可以試試這個:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.