2016-04-04 12 views
0

Ich habe die folgende Abfrage, die ich nicht die Ergebnisse zu produzieren hat schreiben:Abfrage nicht Bestellung richtig

select distinct "ID","Name" 
    from (
select myview.ID as "ID", myview.Name as "Name", 
    rank() over (partition by myview.ID order by myview.OTHER_ID DESC, rownum) rnk 
from my_view myview 
)where rnk = 1 
ORDER BY "Name" DESC; 

ich mit dem Namen Attribut bestellen müssen, die ein String ist, aber es ist nicht obwohl ich Bestellung haben Sie die Reihenfolge nach Namen Aussage. Wie kann ich es mit Namen bestellen?

Also für die name Spalte die Daten, die es gibt die Daten in dieser Reihenfolge:

368838, "AUSER03232, JOHN" 
368532, "BUSER000417, JANE" 
    20252, "BUSER108276, JANE" 
    75235, "AUSER01809, JANE" 
+3

Da das vernünftig aussieht, müssen Sie uns einige Rohdaten zeigen, die Ausgabe, die Sie jetzt erhalten, und die Ausgabe, die Sie erwarten. Der Spaltendatentyp und Ihre NLS_SORT- und NLS_COMP-Einstellungen könnten ebenfalls nützlich sein, wenn es nicht nur ein Missverständnis darüber ist, wann die Sortierung zum Beispiel angewendet wird. Was macht 'rownum' im Rangsatz - was soll das machen? –

+0

Aktualisierte Frage. – user2924127

+2

Die sind richtig bestellt. Aufsteigend wäre A-Z, absteigend ist Z-A. 'JOHN' kommt, bevor' JANE' absteigt. –

Antwort

0

Die distinct nicht notwendig ist (obwohl es nicht die order by beeinflussen sollte). Ihr rank() enthält rownum - was jede Zeile einzigartig machen sollte. Daher verwenden nur row_number() statt und loszuwerden, die distinct:

select "ID", "Name" 
from (select myview.ID as "ID", myview.Name as "Name", 
      row_number() over (partition by myview.ID order by myview.OTHER_ID DESC) as seqnum 
     from my_view myview 
    ) v 
where seqnum = 1 
order by "Name" DESC; 

Das spart den Aufwand für die doppelte Entfernung.

Eine Sache, die Ihr Problem verursachen würde, wenn Sie einfache Anführungszeichen anstatt doppelte Anführungszeichen in den order by verwendet: order by "Name" von order by 'Name' ganz anders.

+0

Das rownum ist in der Reihenfolge, nicht die Partition, so würde es es nicht mehr einzigartig machen; und hätte nur Auswirkungen, wenn es ein doppeltes ID-OTHER_ID-Paar gäbe? Selbst dann wäre seine Wirkung bestenfalls nicht deterministisch ... –

+0

@AlexPoole. . . Ich bin mir ziemlich sicher, dass Duplikate in der 'Reihenfolge von' verhindern werden, was wiederum bedeutet, dass der' rank() 'niemals doppelte Werte zurückgibt. –

0

Ihre Ausgabedaten stimmen nicht mit dieser Abfrage überein.

Verwenden Sie Ihre "Ausgang" -Daten .. und füttern es zurück in die Abfrage, und führt zu einem völlig anderen Ausgang .. so gibt es etwas, das Sie machen - denke ich.

Bitte, bitte PLEASE .. posten Sie ein KOMPLETTES ARBEITSBEISPIEL .. von Anfang bis Ende .. inkl. Tabellenerstellung, oder Eingabe von Daten wie ich ... selbst ausführen .. und zeigen Sie die tatsächlichen Ergebnisse .. kopieren/eingefügt .. NICHT manuell massieren, um es "mehr wie das Problem aussehen". Wenn es Ihr „Problem“ nicht neu zu erstellen, dann ist es kein gutes Beispiel;)

with w_data as (
     select 368838 ID, 'AUSER03232, JOHN' Name from dual union all 
     select 368532 ID, 'BUSER000417, JANE' Name from dual union all 
     select 20252 ID, 'BUSER108276, JANE' Name from dual union all 
     select 75235 ID, 'AUSER01809, JANE' Name from dual 
     ) 
    select distinct ID, Name 
    from (
     select myview.ID as ID, myview.Name as Name, 
      rank() over (partition by myview.ID order by myview.ID DESC, rownum) rnk 
     from w_data myview 
     ) 
    where rnk = 1 
    ORDER BY Name DESC; 

      ID NAME 
    ---------- ----------------- 
     20252 BUSER108276, JANE 
     368532 BUSER000417, JANE 
     368838 AUSER03232, JOHN 
     75235 AUSER01809, JANE 

    SQL> 

Hinweis Ich habe eine Abfrage zur Verfügung gestellt, in dem ANYONE jetzt kann/Paste kopieren und auf ihrem Server läuft, leicht, und wiederholbar. Sie können leicht bestätigen, wenn es die gleichen Ergebnisse erzeugt, die ich habe, oder etwas anderes, und dann leicht sagen, was ich falsch gemacht habe (wenn überhaupt) ..;)

Verwandte Themen