2016-06-21 10 views
3

Ich habe eine Tabelle, die drei Felder wie folgt hat:Erhalten Sie Datensätze mit max Summenwert von gruppierten SQL führt

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

ich die Platte auswählen mag, die für jeden PK höchsten Wert der Summe des Wertes hat, gruppiert nach PK und Konto, so sollte mein Ergebnis so aussehen:

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

ich diese Lösung versucht:

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 

Es funktioniert, aber ich frage Sie eine schnellere Lösung. Ich könnte tausend Datensätze haben, die passen würden. Ich kann keine gespeicherte Prozedur verwenden. Verwenden von SQL Server.

+1

Verwenden Sie MySQL oder SQL Server? Kannst du angemessen taggen? –

+0

@Kason Sie haben seine Frage verwechselt. – Blank

+0

Wenn Sie den Link sqlfiddle.com für diese Art von Frage bereitstellen, hilft dies uns, schneller und genauer zu lösen. –

Antwort

2

In 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 

Ausgang:

PK account  value 
1 40010101 630 
2 40010569 300 
+0

thankssss! Es ist, was ich suche –

+0

Mein Vergnügen! :) – gofr1

1

Ein Weg, um zu erreichen, was Sie wollen, ist mit einer Reihe von Joins:

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 

Klicken Sie auf den Link unten für eine laufende Demo:

SQLFiddle

+1

Verwenden Sie Max ohne Gruppe durch? – Kason

+0

@TimBiegeleisen Jetzt ist richtig, aber das scheint zu der Lösung mit Frage ähnlich zu sein. :-( – Blank

+0

MySQL hat keine analytischen Funktionen, dieser Ansatz kann in diesem Fall nicht so schlecht sein. –

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

Sie sind im Wesentlichen gleichwertig zu einander (in der Tat implementieren einige Datenbanken DISTINCT unter der Haube).

Wenn einer von ihnen schneller ist, wird es DISTINCT sein. Dies liegt daran, dass ein Abfrageoptimierer trotz der beiden Unterschiede die Tatsache erfassen muss, dass GROUP BY keine Gruppenmitglieder nutzt, sondern nur deren Schlüssel. DISTINCT macht dies explizit, so dass Sie mit einem leicht dümmer Optimierer kommen können.

Im Zweifelsfall Test

0

tun, wie diese Unterabfrage

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

Ihre Lösung verwendet, ist auf jeden Fall eine korrekte eins, ein Und leicht zu verstehen, es ist auch nicht so schlecht, ich weiß nicht, ob es einen besseren gibt, um zu bekommen, was du willst, was ich dir anbiete, tu mein Bestes, um die Abfrage einfacher zu machen, probiere es trotzdem aus .

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

Hope this Ihnen helfen. :-)

1

Sie unter Abfrage versuchen können, wird es

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

Ich habe über Abfrage durchgeführt funktioniert gut –

0

Arbeit habe ich eine andere Antwort von Unterabfrage und Grenze 1 in mysql:

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; 

Ich weiß nicht, seine Leistung ist besser oder nicht. Bitte überprüfen Sie die Leistung und informieren Sie uns.

Ich stellte Sqlfiddle Verbindung auch zur Verfügung.

Verwandte Themen