2017-01-03 5 views
0

Ich habe 4 Spalten in einer TabelleRang über Partition in Oracle SQL (Oracle 11g)

  • Firma Teilenummer
  • Hersteller-Teilenummer
  • Bestellnummer
  • Part Eingangsdatum

    Ex.

enter image description here

Ich möchte nur einen Datensatz zurückzukehren basierend auf dem maximalen Teil Eingangsdatum, die die erste Zeile in der Tabelle (die mit Teileingangsdatum 2015.03.31) sein würden.

Ich versuchte

RANK() OVER (PARTITION BY Company Part Number,Manufacturer Part Number 
      ORDER BY Part Receipt Date DESC,Order Number DESC) = 1 

am Ende der Anweisung WHERE und das hat nicht funktioniert.

Antwort

1

Dies scheint zu tun, was Sie wollen:

select t.* 
from (select t.* 
     from t 
     order by partreceiptdate desc 
    ) t 
where rownum = 1; 
+0

Die OP-Partitionen von 'company_part_number' und' manufacturer_part_number' in seinem Versuch, haben Sie das bemerkt? – mathguy

+0

@mathguy. . . Ich denke, dass das Lesen der Frage SEHR klar ist: "Ich möchte nur einen Datensatz basierend auf dem maximalen Teilempfangsdatum zurückgeben, das die erste Zeile in der Tabelle wäre". Fensterfunktionen sind für diese Operation übertrieben. –

+0

Es fällt Ihnen also nicht ein, dass das OP eine vereinfachte Eingabe zeigt, obwohl er tatsächlich mehrere verschiedene Teilenummern und Herstellerteilenummern hat, für die er versucht, die neueste Teillieferung zu erhalten? Ernst? – mathguy

0

Analytische Funktionen wie rank() in der SELECT Klausel vorhanden sind, können sie nicht direkt in einer WHERE Klausel in Anspruch genommen werden. Um rank() wie gewünscht zu verwenden, müssen Sie es in einer Unterabfrage deklarieren und dann in der äußeren Abfrage in der WHERE-Klausel verwenden. Etwas wie folgt aus:

select company_part_number, manufacturer_part_number, order_number, part_receipt_date 
from (select t.*, rank() over (partition by... order by...) as rnk 
     from your_table t 
     ) 
where rnk = 1 

Beachten Sie auch, dass Sie sich nicht auf einen Spaltennamen wie company part number (mit Leerzeichen drin) haben - zumindest nicht, wenn sie eingeschlossen in doppelten Anführungszeichen, die eine sehr schlechte Praxis ist, am besten vermieden.

+0

Vielen Dank für Ihre Hilfe. Das hat funktioniert. Habe noch eine Frage. Aus Reporting-Gründen muss ich nur die TT/MM/JJJJ allein aus der Part Receipt Date Spalte ohne den Zeitteil zurückgeben. Kannst du mir damit helfen? – Jude92

+0

@ Jude92 - Anstatt "part_receipt_date" in 'select' einzubeziehen, sollte' to_char (part_receipt_date, 'tt/mm/yyyy') '' eingeschlossen werden. Tun Sie dies nur für den Abschlussbericht, nicht für Zwischenergebnisse. – mathguy