it-swarm.com.de

SQL ist keine Gruppenfunktion für eine einzelne Gruppe

Wenn ich die folgende SQL-Anweisung ausführe:

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

Es gibt den maximalen Gesamtwert der Downloads eines Kunden zurück. Wenn ich jedoch versuche, die Sozialversicherungsnummer zu finden, zu der dieser Höchstwert gehört, füge ich sie der select-Anweisung hinzu:

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

Ich erhalte folgenden Fehler:

keine Einzelgruppen-Gruppenfunktion

Ich verstehe nicht, warum es diesen Fehler auslöst. Eine Google-Suche ergab die folgende Aktion:

Löschen Sie entweder die Gruppenfunktion oder den einzelnen Spaltenausdruck aus der SELECT-Liste oder fügen Sie eine GROUP BY-Klausel hinzu, die alle aufgeführten einzelnen Spaltenausdrücke enthält

Nach allem, was ich denke, wird durch das Löschen der Gruppenfunktion der Summenwert ungültig. Durch das Löschen des einzelnen Spaltenausdrucks (SSN) erhalte ich nur die maximale Summe. Bei diesem dritten Teil bin ich mir nicht sicher.

Könnte jemand in die richtige Richtung führen?

-Tomek

BEARBEITEN: ZEIT in dieser Datenbank bezieht sich auf die Anzahl der Downloads

35
Tomek

Einfach ausgedrückt, das Problem ist, dass die SUMME (ZEIT) für eine bestimmte SSN in Ihrer Abfrage ein einzelner Wert ist. Daher wird MAX beanstandet, da dies keinen Sinn ergibt (das Maximum eines einzelnen Werts ist bedeutungslos).

Sie sind sich nicht sicher, welchen SQL-Datenbankserver Sie verwenden, aber ich vermute, Sie möchten eine Abfrage wie diese (geschrieben mit einem MSSQL-Hintergrund - müssen möglicherweise auf den von Ihnen verwendeten SQL-Server übersetzt werden):

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 der Gesamtzeit dafür.

Bearbeiten - Wenn Sie mehrere mit der gleichen Zeit haben und alle möchten, würden Sie Folgendes verwenden:

SELECT
SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))
35
fyjham

Wenn Sie die Download-Nummer für jeden Kunden wünschen, verwenden Sie:

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

Wenn Sie nur einen Datensatz wünschen - für einen Kunden mit der höchsten Anzahl an Downloads - verwenden Sie:

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 möchten, die die höchste Position teilen, verwenden Sie:

select *
  from (
        select ssn
             , sum(time)
             , dense_rank() over (order by sum(time) desc) r
          from downloads
         group by ssn
       )
 where r = 1
10
Egor Rogov

Vielleicht finden Sie das einfacher

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

2
Khb