2016-08-06 6 views
2

Ich muss die niedrigste Zahl in meiner RESULT-Spalte finden, die ich mit MIN kann getan werden, aber ich bin mir nicht sicher, wie dies tun und wählen Sie meine anderen Spalten. Mein Code zeigt alle Ergebnisse für alle Mitglieder an, aber ich möchte nur, dass das beste Ergebnis (niedrigste Anzahl) zusammen mit den anderen Details für dieses Mitglied angezeigt wird.Wählen Sie die niedrigste Zahl aus der Spalte und zeigen Sie andere Spalten

Im Moment habe ich mehrere Einträge, die wie folgt aussehen:

EVENT_ID EVENT_TYPE EVENT_NAME MEMBER_ID MEMBER_FIRSTNAME MEMBER_LASTNAME RESULT 
event1  track  100M  0001  John    Smith   11.3 

Ich muss nur die Zeile auswählen, mit dem niedrigsten Ergebnis und zeigen, dass man nur. Hier ist mein Code so weit:

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT 
FROM EVENT E, MEMBER M, RANK R 
WHERE E.EVENT_ID = R.EVENT_ID 
AND R.MEMBER_ID = M.MEMBER_ID; 

SGEDDES - Ich habe versucht, die letzte Methode folgen und konnte es nicht arbeiten:

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT 
FROM (EVENT E, MEMBER M, RANK R 
WHERE E.EVENT_ID = R.EVENT_ID 
AND R.MEMBER_ID = M.MEMBER_ID; 
ORDER BY RESULT) 
WHERE ROWNUM = 1; 
+0

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm Verwenden Sie die Funktion ROW_NUMBER, um zu ermitteln, welche Datensätze in einer CTE oder einer verschachtelten Abfrage angezeigt werden sollen, und wählen Sie dann ROW_NUMBER = 1 aus. Ich würde versuchen, es dir zu zeigen, aber wenn du sagst, dass du das niedrigste Ergebnis haben willst, ist das pro Ereignis, pro Mitglied, pro Kombination ihr Aus oder ??? – Matt

+0

In welcher Version von Oracle laufen Sie? – sgeddes

+0

@sgeddes Oracle Application Express 3.2.1.00.12 –

Antwort

1

Hier ist eine Option row_number verwenden (auch beachten Sie bitte die join Syntax - in der Regel sollten Sie keine Kommas in der from Klausel) verwenden:

SELECT * 
FROM (
    SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, 
     R.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT, 
     row_number() over (order by R.RESULT) rn 
    FROM EVENT E JOIN RANK R ON E.EVENT_ID = R.EVENT_ID 
     JOIN MEMBER M ON R.MEMBER_ID = M.MEMBER_ID 
) t 
WHERE rn = 1 

Wenn Sie die Ergebnisse nach einem bestimmten Feld gruppieren müssen, verwenden Sie partition by. Zum Beispiel:

row_number() over (partition by e.event_id order by result) rn 

Und hier ist eine andere Option rownum:

SELECT * 
    FROM (<<YOUR QUERY HERE>> ORDER BY R.Result) 
WHERE ROWNUM = 1; 
+0

Ich habe Ihre letzte Methode ausprobiert und konnte sie nicht zum Laufen bringen. Ich habe meine Frage bearbeitet, um den von mir verwendeten Code anzuzeigen. –

0

In den neuesten Versionen von Oracle, können Sie fetch first 1 row only:

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, R.MEMBER_ID, 
     M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, R.RESULT 
FROM EVENT E JOIN 
    RANK R 
    ON E.EVENT_ID = R.EVENT_ID JOIN 
    MEMBER M 
    ON R.MEMBER_ID = M.MEMBER_ID 
ORDER BY R.RESULT 
FETCH FIRST 1 ROW ONLY; 

Wenn Sie eine weniger aktuelle Version von Oracle, dann ist eine von Sgeddes Lösungen in Ordnung.

+0

"SQL-Befehl wurde nicht ordnungsgemäß beendet". Ich mag diese Methode. Gibt es eine Möglichkeit, dies ohne die letzte Zeile zu tun? WHERE ROWNUM = 1; funktioniert nicht. –

+0

@JameB. . . Wenn Ihre Version von Oracle älter als 12c ist, verwenden Sie die von sgeddes vorgeschlagene Lösung. –

Verwandte Themen