返回重复最小值
问题描述:
请参阅下表以供参考。我需要返回包含最小值的重复行。返回重复最小值
在这个例子中,我只想显示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)
答
你会使用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;
答
也许我没有正确认识这个问题,但这里是我的潜在解决方案:
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)
我没有得到那个排名的事情。为什么要用wm.slat_len分区?为什么要按lg.wd_demand_id命令?你不是在寻找'rank()over(by wm.slat_len)'吗? (或者'ORDER BY wm.slat_len如果你有Oracle 12c,请先带上TIES'行 –
@ThorstenKettner谢谢!我甚至没有考虑删除“分区”。那给了我我正在寻找的东西。 –
好的,我会将其作为回答发布,以便将来的读者轻松找到解决方案。 –