SQL nicht eine einzige Gruppengruppenfunktion

stimmen
32

Wenn ich die folgende SQL-Anweisung:

SELECT MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

Es gibt den maximalen Summenwert von Downloads von einem Kunden, aber wenn ich versuche, die Sozialversicherungsnummer zu finden, dass dieser Maximalwert gehört, indem es auf die select-Anweisung hinzu:

SELECT SSN, MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

Ich erhalte die folgende Fehlermeldung:

nicht eine Funktion single-Gruppe Gruppe

Ich verstehe nicht, warum es diesen Fehler zu werfen. Eine Google-Suche kam mit der folgenden Aktion auf:

Drop entweder die Gruppenfunktion oder die einzelnen Spaltenausdruck aus der SELECT-Liste oder eine GROUP BY-Klausel hinzufügen, die alle einzelnen Spaltenausdrücke enthält aufgelistet

Von dem, was ich denke, das sagt - Fallenlassen die Gruppenfunktion macht den ungültigen Summenwert - den einzelnen Spaltenausdruck Droping (SSN) wird mir nur die max Summe geben - nicht sicher über diesen dritten Teil.

Könnte jemand in die richtige Richtung?

-Tomek

EDIT: TIME in dieser Datenbank bezieht sich auf die Anzahl der mal heruntergeladen

Veröffentlicht am 25/11/2009 um 08:22
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
34

Nun das Problem einfach Stoßen ist, dass die Summe (TIME) für einen bestimmten SSN auf Ihrer Anfrage ein einzelner Wert ist, so ist es seine Einwände gegen MAX, da es keinen Sinn macht (das Maximum eines einzigen Wertes ist bedeutungslos).

Nicht sicher, was SQL-Datenbank-Server Sie verwenden, aber ich vermute, Sie wollen eine Abfrage mehr wie folgt aus (Geschrieben mit einem MSSQL Hintergrund - etwas übersetzen, um den SQL-Server müssen Sie verwenden):

SELECT TOP 1 SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
ORDER BY 2 DESC

Dies gibt Ihnen die SSN mit der höchsten Gesamtzeit und die Gesamtzeit für sie.

Bearbeiten - Wenn Sie mit einer gleichen Zeit mehrere haben und wollen, dass sie alle würden Sie verwenden:

SELECT
SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))
Beantwortet am 25/11/2009 um 08:27
quelle vom benutzer

stimmen
10

Wenn Sie Downloads Nummer für jeden Kunden möchten, verwenden Sie:

select ssn
     , sum(time)
  from downloads
 group by ssn

Wenn Sie nur einen Datensatz - für einen Kunden mit der höchsten Anzahl von Downloads - Verwendung:

select *
  from (
        select ssn
             , sum(time)
          from downloads
         group by ssn
         order by sum(time) desc
       )
 where rownum = 1

Wenn Sie jedoch alle Kunden mit der gleichen Anzahl von Downloads sehen wollen, die die höchste Position teilen, verwenden:

select *
  from (
        select ssn
             , sum(time)
             , dense_rank() over (order by sum(time) desc) r
          from downloads
         group by ssn
       )
 where r = 1
Beantwortet am 25/11/2009 um 09:12
quelle vom benutzer

stimmen
2

Vielleicht finden Sie diese einfache

select * from (
    select ssn, sum(time) from downloads
    group by ssn
    order by sum(time) desc
) where rownum <= 10 --top 10 downloaders

Grüße
K

Beantwortet am 25/11/2009 um 20:33
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more