有趣的存储过程【持续更新】

luguang 2019-07-02 03:23:45
加精
如果从一个表A中抽取n条数据,要让n条数据中金钱这个字段之和无限接近传入的参数Needmoney,返回结果集n条数据的id.
A表的结构 [ID]主键,[Money] decimal(18,2),参考如下
ID Money
8043 484.740
8042 511.410
239158 335.500
239156 306.500
239157 279.000
239159 388.500
8045 507.250
8046 455.520
8047 520.090
8050 523.030
如果输入参数Needmoney1500条,返回最合适的n条数据的ID,目标数据库是Oracle,请各位集思广益,共同提高?
...全文
43201 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41037215 2021-03-05
  • 打赏
  • 举报
回复
学习来了...
acen_chen 2020-12-11
  • 打赏
  • 举报
回复
个人觉得数据量大又不限个数可能效率较低。。。 1个数,直接取小于入参的最大数 2个数组合,类似select max(ta.amount + tb.amount) from (select * from tmp_test where amount < 入参) ta ,(select * from tmp_test where amount < 入参) tb where ta.id <> tb.id and ta.amount + tb.amount <= 入参; 只要取出值不等于入参就继续(如果要返回多解的话,即便有等于入参也可继续) 依次类推,三个数组合就是三个表关联。。。
luguang 2020-04-15
  • 打赏
  • 举报
回复
引用 49 楼 qq_38046053 的回复:
写一个函数返回对应的字段 同你输入的参数去比较 判断 返回最优值
能否贴出详细的函数,并且在数据库中验证过的结果
Mr.?t 2020-04-11
  • 打赏
  • 举报
回复
with a as( select sys_connect_by_path (id, '/')||'/' path from TABLE_TEST connect by nocycle prior id < id and level <=(select count(*) from TABLE_TEST)) select * from( select path,sum(b.money),row_number() over(order by abs(1500-sum(b.money))) rn from a join TABLE_TEST b on a.path like '%/'||b.id ||'/%' group by path ) WHERE RN=1
军哥1930 2020-02-28
  • 打赏
  • 举报
回复
按money排序然后使用sum over汇总money 然后按上述结果集汇总的money与入参比较即可
繁星如尘 2020-02-27
  • 打赏
  • 举报
回复
create or replace procedure sp_a(v_money aaa.money%type)
as
v_id aaa.id%type;
begin
with a as
(select id,money,abs(money-v_money) t from aaa)
select id into v_id from a where t=(select min(t) from a);
dbms_output.put_line(v_id);
end;
qq_38046053 2020-01-19
  • 打赏
  • 举报
回复
写一个函数返回对应的字段 同你输入的参数去比较 判断 返回最优值
om林mo 2020-01-13
  • 打赏
  • 举报
回复
好深奥,对于我这小白抽干了

mh6438-QQ 2019-12-15
  • 打赏
  • 举报
回复
引用 40 楼 owenzhang的回复:
http://club.excelhome.net/thread-1085112-1-1.html
这个算法不错,可以学习
baidu_26569043 2019-11-27
  • 打赏
  • 举报
回复
厉害了厉害了
xgh360271492 2019-11-25
  • 打赏
  • 举报
回复
可以吗,不知道好不好
a8836 2019-11-15
  • 打赏
  • 举报
回复
楼主我觉得有点不合理啊
qq_43797124 2019-11-14
  • 打赏
  • 举报
回复
经典的凑单法~
donghe920 2019-10-31
  • 打赏
  • 举报
回复
学习一下
zhangliangmilan 2019-10-30
  • 打赏
  • 举报
回复
学习学习学习一下
owenzhang 2019-10-24
  • 打赏
  • 举报
回复
http://club.excelhome.net/thread-1085112-1-1.html
owenzhang 2019-10-24
  • 打赏
  • 举报
回复
在excle home有个凑单的贴子, 算法可以借鉴
  • 打赏
  • 举报
回复
我来混分 zzz
cguocc 2019-10-15
  • 打赏
  • 举报
回复
马克一下顺便试试第一次评论
AT152S 2019-09-30
  • 打赏
  • 举报
回复
我来学习的
加载更多回复(31)

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧