簡體   English   中英

按兩列分組,取總和,然后取最大值

[英]Group by two columns, take sum, then max

共有三列: Id (char)、 Name (char) 和Score (int)。

首先,我們按IdName分組,並為每個組添加Score 讓我們將添加的分數total_score

然后,我們按Name分組,只取total_score及其對應的IdName的最大值。 我擁有其他一切,但我很難弄清楚如何獲得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...

只需按Namerow_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM