2017-07-07 8 views
0

Siehe nachstehende Tabelle. Ich muss doppelte Zeilen mit dem minimalen Wert zurückgeben.Geben Sie doppelte Minwerte zurück.

In diesem Beispiel möchte ich nur die 2 Zeilen anzeigen, die SLAT_LEN = 30 bzw. MIN SLAT_LEN haben. Ich habe versucht Rang, aber wenn ich es tue, macht es einen aufeinanderfolgenden Rang. Ich möchte, dass die doppelten Größen denselben Rang haben und nacheinander nach Größe sortiert werden.

Die Größen ändern, so kann ich ist es verwenden nicht nur eine Bedingung wie SLAT_LEN = 30.

Oder ein anderer Ansatz, den ich nehmen sollte?

select * 
    from(
    select lg.wd_demand_id,wm.slat_len, wm.prof_size, wm.wd_material_id, wm.color, rank() over (partition by wm.slat_len order by lg.wd_demand_id) as rank 
    from wd_demand_log lg, wd_bins wb, wd_material wm, wd_bins_material wbm 
    where lg.wd_bins_id = wb.wd_bins_id 
    and lg.wd_material_id = wm.wd_material_id 
    and lg.wd_bins_id = wbm.wd_bins_id 
    and lg.wd_material_id = wbm.wd_material_id 
    AND lg.plant_id = 44 AND lg.dept_id = 220 AND wb.plant_id = 44 AND wb.dept_id = 220 
    AND NOT EXISTS(SELECT dmpln.wd_demand_id FROM wd_demnd_pln_inv dmpln WHERE dmpln.wd_demand_id = lg.wd_demand_id) 
    AND wm.prof_size = '2' AND wm.color = 450 
    AND lg.wd_po_error is null) 

enter image description here

+1

Ich bekomme diese Rang-Sache nicht. Warum Partition von wm.slat_len? Warum 'order by lg.wd_demand_id'? Suchst du nicht einfach nach 'rank() over' (order by wm.slat_len) '? (Oder vielmehr 'ORDER BY wm.slat_len FETCH FIRST 1 REIHE MIT KRAWATTEN' falls Sie Oracle 12c haben?) –

+0

@ThorstenKettner Thanks! Ich habe nicht einmal darüber nachgedacht, "Partition durch" zu entfernen. Das gab mir genau das, wonach ich suchte. –

+0

Okay, ich poste dies als Antwort, damit zukünftige Leser die Lösung leicht finden. –

Antwort

2

Sie würden PARTITION BY verwenden Sie den Bereich, in dem geben, Rang zu. Die ORDER BY gibt das Ranking an. Also in Ihrem Fall müssen Sie so etwas wie

rank() over (order by wm.slat_len) 

Falls Sie Oracle 12c können Sie Ihre Ergebnisse mit FETCH FIRST begrenzen:

ORDER BY wm.slat_len 
FETCH FIRST 1 ROW WITH TIES; 
0

Vielleicht ich nicht das Problem richtig zu verstehen bin, aber hier ist meine mögliche Lösung:

WITH aset 
    AS (SELECT lg.wd_demand_id 
       , wm.slat_len 
       , wm.prof_size 
       , wm.wd_material_id 
       , wm.color 
      FROM wd_demand_log lg, wd_bins wb, wd_material wm 
       , wd_bins_material wbm 
      WHERE lg.wd_bins_id = wb.wd_bins_id 
      AND lg.wd_material_id = wm.wd_material_id 
      AND lg.wd_bins_id = wbm.wd_bins_id 
      AND lg.wd_material_id = wbm.wd_material_id 
      AND lg.plant_id = 44 
      AND lg.dept_id = 220 
      AND wb.plant_id = 44 
      AND wb.dept_id = 220 
      AND NOT EXISTS 
        (SELECT dmpln.wd_demand_id 
         FROM wd_demnd_pln_inv dmpln 
         WHERE dmpln.wd_demand_id = lg.wd_demand_id) 
      AND wm.prof_size = '2' 
      AND wm.color = 450 
      AND lg.wd_po_error IS NULL) 
SELECT * 
    FROM aset 
WHERE slat_len = (SELECT MIN (slat_len) 
        FROM aset) 
Verwandte Themen