2016-03-30 12 views
0

Ich habe ein Problem mit Oracle SQL-Skript. Ich muss alle Autoren (Logins) mit den meisten Publikationen auswählen. Wenn es mehr Logins mit der gleichen Anzahl von Publikationen gibt, muss ich sie alle auswählen. list of publications looks like this:SQL ORACLE - Auswahl Autor mit den meisten Publikationen (die meisten Zeilen) mit MAX()

I brauchen MAX() Funktion zu nutzen .. so weit ich habe versucht, so etwas wie dies zu tun:

SELECT P.LOGIN, COUNT(*) 
FROM PISE P 
GROUP BY P.LOGIN, HAVING COUNT(*) >= MAX(PUBLICATIONS) 
(
SELECT COUNT(*) AS PUBLICATIONS 
FROM PISE P 
GROUP BY P.LOGIN 
); 

was zu ORA-00933: SQL-Befehl beendet nicht richtig

oder

SELECT P.LOGIN, COUNT(*) as PUBLICATIONS 
FROM PISE P 
GROUP BY P.LOGIN HAVING PUBLICATIONS >= MAX(PUBLICATIONS); 

res ulting in ORA-00904: "Publikationen": ungültige Kennung

oder

SELECT P.LOGIN, COUNT(*) 
    FROM PISE P 
    WHERE COUNT(*) IN (
    SELECT MAX(COUNT(*)) 
    FROM PISE 
    ); 

was ORA-00934: Gruppenfunktion ist hier nicht erlaubt.

This is the result I am looking for

(ohne jméno und Příjmení Spalte).

+1

Warum PUBLIKATIONEN> = MAX (Publikationen) und nicht = (gleich)? In dem anderen Versuch, warum COUNT (*) IN (SELECT MAX ...) und nicht = (gleich) anstelle von "IN"? In beiden Fällen ist = am sinnvollsten. AUCH: Der Vorname und der Nachname des Autors sind nicht in der Originaltabelle, wie sollen sie in der Ausgabe erscheinen? Sie werden wahrscheinlich einen Join benötigen (wenn Vor- und Nachnamen in einer anderen Tabelle sind, wie sie sein sollten), aber Sie haben keine Informationen darüber angegeben. – mathguy

+0

Ja, Ändern> = macht keinen Unterschied. Am Anfang, dass was ich dort hatte, aber während ich versuchte, es irgendwie zu lösen, versuchte ich alles, was mir in den Sinn kam. changin IN to = endet mit dem gleichen Ergebnis. EDIT: Vorname und Nachname ist in verschiedenen Tabelle enthalten, ich werde es später hinzufügen, aber das ist nicht das, was ich gelöst werden muss, also habe ich es vernachlässigt. Mit anderen Worten, ich habe versucht, mein Problem auf die Wurzel des Problems zu vereinfachen. – sKyTzi

+0

Richtig - ich schlug nicht vor, dass das die Anfragen reparieren wird (schließlich sind sowohl> = als auch "IN" vollkommen legitim - einfach ineffizient). Ihre Abfrage schlägt fehl, weil Sie nach der ersten Abfrage sofort eine Unterabfrage starten. Wahrscheinlich wollten Sie dort eine WHERE-Klausel haben, aber das Wort WHERE ist nicht vorhanden. Die zweite Abfrage schlägt fehl, da der Alias ​​PUBLICATIONS nur in der Klausel GROUP BY (in der SELECT-Klausel) hinzugefügt wird. Daher gibt es auf der Ebene GROUP BY (noch) keine Kennung "PUBLICATIONS". – mathguy

Antwort

0

Mit "Klausel" (erhältlich in den Versionen 11 und höher):

with a as (select login, count(*) as cnt from p group by login), 
    b as (select max(cnt) as max_cnt from a) 
select a.login, a.cnt from a, b where a.cnt = b.max_cnt 
/
+0

ORA-04044: Prozedur, Funktion, Paket oder Typ ist hier nicht erlaubt 04044. 00000 - "Prozedur, Funktion, Paket oder Typ ist hier nicht erlaubt" * Ursache: Eine Prozedur, Funktion oder Paket wurde in angegeben ein unpassender Ort in einer Aussage. * Aktion: Stellen Sie sicher, dass der Name korrekt ist, oder entfernen Sie ihn. Ich nehme an, meine Version ist älter :) – sKyTzi

+0

??Was ich zur Verfügung gestellt habe ist eine SQL-Anweisung, haben Sie versucht, es in eine Prozedur oder Funktion zu wickeln? Es hat wahrscheinlich nichts mit der Version zu tun - schon gar nicht mit dieser Fehlermeldung. Ich habe die Abfrage für meine Version von Oracle getestet und es funktioniert gut. Was ist deine Version? Bitte führen Sie die folgende SQL-Anweisung (NICHT in irgendeiner Funktion oder Prozedur WRAPPED) und sehen, was es sagt: Wählen Sie * aus v $ Version – mathguy

+0

Übrigens habe ich "p" als Name der ursprünglichen Tabelle (erste Zeile des Codes); Bitte ändern Sie das zu Ihrem tatsächlichen Tabellennamen. – mathguy