2016-06-21 26 views
3

我有三個字段像這樣的表:獲取與分組SQL的最大總和值的記錄結果

PK  account  value 
----------------------- 
1  40010101 130 
1  40010101 500 
1  40010569 590 
2  40010569 300 
2  40010101 200 

我要選擇它針對每個PK值之和的最高值的記錄,通過PK和帳戶分組,所以我的結果應該是這樣的:

PK  account  value 
----------------------- 
1  40010101 630 
2  40010569 300 

我試過這個解決方案:

SELECT 
pn.* 
FROM 
(select PK, account, sum(value) as value 
from table 
group by PK, account) pn 
INNER JOIN 
(select PK, MAX(value) AS maxvalue 
from (select PK, account, sum(value) as value 
     from table 
     group by PK, account) pn 
group by PK) maxsum 
ON pn.PK= maxsum.PK 
AND pn.value = maxsum.maxvalue 

它有效,但我問你一個更快的解決方案。我可以有一千個記錄匹配。我無法使用存儲過程。 使用SQL服務器。達到你想要什麼

+1

你使用的是MySQL還是SQL Server?你能適當地標記嗎? –

+0

@Kason你誤解了他的問題。 – Blank

+0

如果您提供sqlfiddle.com鏈接,這種類型的問題,這將有助於我們解決更快,更準確。 –

回答

2

在SQL Server

SELECT PK, 
     account, 
     sum_value AS [value] 
FROM (
    SELECT PK, 
      account, 
      SUM([value]) as sum_value, 
      ROW_NUMBER() OVER (PARTITION BY PK ORDER BY SUM([value]) DESC) as rn 
    FROM [table] 
    GROUP BY account, PK 
) as p 
WHERE rn = 1 

輸出:

PK account  value 
1 40010101 630 
2 40010569 300 
+0

thankssss!這就是我在尋找 –

+0

是我的榮幸!:) – gofr1

1

的一種方法是用一系列的連接:

SELECT t1.PK, t1.account, t1.value 
FROM 
(
    SELECT PK, account, SUM(value) AS value 
    FROM yourTable 
    GROUP BY PK, account 
) t1 
INNER JOIN 
(
    SELECT t.PK, MAX(t.value) AS value 
    FROM 
    (
     SELECT PK, account, SUM(value) AS value 
     FROM yourTable 
     GROUP BY PK, account 
    ) t 
    GROUP BY t.PK 
) t2 
    ON t1.PK = t2.PK AND t1.value = t2.value 

點擊下面的運行演示的鏈接:

SQLFiddle

+1

使用最大值無組? – Kason

+0

@TimBiegeleisen現在是正確的,但是這似乎是類似於問題中提到的解決方案。 :-( – Blank

+0

MySQL沒有分析功能,這種做法可能無法在這種情況下是如此糟糕。 –

0
SELECT C.* FROM 
(
    SELECT PK,account,SUM(VALUE) AS VALUE 
    FROM TABLE1 
    GROUP BY PK,account 
) AS C INNER JOIN 
(
    SELECT A.PK, MAX(SUMVALUE) AS MAXVALUE 
    FROM TABLE1 AS A INNER JOIN 
    (
     SELECT PK,account,SUM(VALUE) AS SUMVALUE 
     FROM TABLE1 
     GROUP BY PK,account 

    ) AS B 
    ON A.PK = B.PK 
    AND A.account = B.account 
    GROUP BY A.PK 
) AS D 
ON C.PK =D.PK 
AND C.VALUE = D.MAXVALUE 
0

它們基本上等同(事實上​​,這是一些數據庫如何在底層實現DISTINCT)。

如果其中一個更快,它將是DISTINCT。這是因爲,雖然兩者是相同的,但查詢優化器必須知道您的GROUP BY沒有利用任何組成員,只是他們的關鍵。 DISTINCT明確表示這一點,所以你可以使用稍微優化的優化器。

有疑問時,測試

0

做這樣的使用子查詢

select id,account,max(amount) as value 
from 
(
select id,account,sum(value) as amount 
from temp_max 
group by account,id 
order by id 
)t 
group by id 
0

您的解決方案絕對是一個正確的一,一個很容易理解,它也不是一個很糟糕的,我不知道是否有更好的獲得你想要的東西,我提供的只是盡我所能使查詢變得更簡單,無論如何嘗試它。

select t.*, if(@pk = `PK`, @rowno := @rowno + 1, @rowno := 1) as vrowno, @pk := `PK` as vpk 
from (
    select `PK`, `account`, sum(`value`) as `value` 
    from table1 
    group by `PK`, `account` 
    order by `PK`, `value` desc) t 
cross join (select @pk := '', @rowno := 0) v 
having vrowno = 1 

SQLFiddle DEMO HERE

希望這會幫助你。 :-)

1

你可以試試下面的查詢,將工作

SELECT pk, 
     SUBSTRING_INDEX(GROUP_CONCAT(account ORDER BY val DESC),',',1) AS account, 
     MAX(val) AS val 
FROM (
    SELECT pk, 
      account, 
      SUM(`value`) AS val 
    FROM test.temp_69 
    GROUP BY pk,account 
    ORDER BY pk 
    ) AS t 
GROUP BY pk; 
+0

我在上面查詢其工作正常執行 –

0

我在mysql中的子查詢和限制1另一個答案:

select PK, account, 
    (select Sum(value) FROM yourTable t2 where t1.PK=t2.PK group by PK,account order by Sum(value) desc limit 1) max_sum 
from yourTable t1 
where (PK, account)= 
    (select PK,account FROM yourTable t2 where t1.PK=t2.PK group by PK,account order by Sum(value) desc limit 1) 
group by PK, account; 

我不知道它的性能好不好。請檢查其性能並通知我們。

我提供Sqlfiddle鏈接也。

相關問題