2017-07-07 172 views
0

請參閱下表以供參考。我需要返回包含最小值的重複行。返回重複最小值

在這個例子中,我只想顯示2行有SLAT_LEN = 30或者說最小SLAT_LEN。我嘗試了排名,但是當我這樣做時,它的排名是連續的。我希望重複尺寸具有相同的等級並按尺寸連續排列。

大小改變,所以我不能只用一個條件像SLAT_LEN = 30

還是有,我應該採取不同的方法?

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

我沒有得到那個排名的事情。爲什麼要用wm.slat_len分區?爲什麼要按lg.wd_demand_id命令?你不是在尋找'rank()over(by wm.slat_len)'嗎? (或者'ORDER BY wm.slat_len如果你有Oracle 12c,請先帶上TIES'行 –

+0

@ThorstenKettner謝謝!我甚至沒有考慮刪除「分區」。那給了我我正在尋找的東西。 –

+0

好的,我會將其作爲回答發佈,以便將來的讀者輕鬆找到解決方案。 –

回答

2

你會使用PARTITION BY給中排名範圍。 ORDER BY指定排名。所以你的情況,你會需要像

rank() over (order by wm.slat_len) 

如果你有甲骨文12C可以用FETCH FIRST限制搜索結果:

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

也許我沒有正確認識這個問題,但這裏是我的潛在解決方案:

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)