2017-07-07 135 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)