zoukankan      html  css  js  c++  java
  • 求支付表中按id累积和最接近100的那条记录

    此例源自美团的一道SQL面试题

    支付表结构:

    create table hy_payment(
        id number(4,0) primary key,
        pay number(3,0) not null)

    可以这样给它充值:

    insert into hy_payment(id,pay) values('1','110');
    insert into hy_payment(id,pay) values('2','9');
    insert into hy_payment(id,pay) values('3','5');
    insert into hy_payment(id,pay) values('4','23');
    insert into hy_payment(id,pay) values('5','78');
    insert into hy_payment(id,pay) values('6','22');
    insert into hy_payment(id,pay) values('7','31');
    insert into hy_payment(id,pay) values('8','8');
    insert into hy_payment(id,pay) values('9','4');
    insert into hy_payment(id,pay) values('11','6');
    insert into hy_payment(id,pay) values('12','5');

    首先把从id=1到当前id的总支付值和与100的偏差值找出来:

    select id,pay,sum(pay) over (order by id) as sumpay,abs(sum(pay) over (order by id)-100) as bias from hy_payment

    从上表我们已经可以125是最接近100的值了,然后把它排序一下:

    select a.*,rank() over(order by a.bias) as seq from (select id,pay,sum(pay) over (order by id) as sumpay,abs(sum(pay) over (order by id)-100) as bias from hy_payment) a order by a.bias

    最后我们只要第一条,即seq=1的那条:

    select b.*
    from
    (select a.*,rank() over(order by a.bias) as seq from (select id,pay,sum(pay) over (order by id) as sumpay,abs(sum(pay) over (order by id)-100) as bias from hy_payment) a order by a.bias) b
    where b.seq=1

    从这条记录可以看出,id(1~5)累计值125是最接近100的记录。

    以上用到的所有SQL:

    create table hy_payment(
        id number(4,0) primary key,
        pay number(3,0) not null)
        
    insert into hy_payment(id,pay) values('1','110');
    insert into hy_payment(id,pay) values('2','9');
    insert into hy_payment(id,pay) values('3','5');
    insert into hy_payment(id,pay) values('4','23');
    insert into hy_payment(id,pay) values('5','78');
    insert into hy_payment(id,pay) values('6','22');
    insert into hy_payment(id,pay) values('7','31');
    insert into hy_payment(id,pay) values('8','8');
    insert into hy_payment(id,pay) values('9','4');
    insert into hy_payment(id,pay) values('11','6');
    insert into hy_payment(id,pay) values('12','5');
    
    commit;
    
    select * from hy_payment
    
    select id,pay,sum(pay) over (order by id) as sumpay,abs(sum(pay) over (order by id)-100) as bias from hy_payment
    
    
    select a.*,rank() over(order by a.bias) as seq from (select id,pay,sum(pay) over (order by id) as sumpay,abs(sum(pay) over (order by id)-100) as bias from hy_payment) a order by a.bias
    
    select b.*
    from
    (select a.*,rank() over(order by a.bias) as seq from (select id,pay,sum(pay) over (order by id) as sumpay,abs(sum(pay) over (order by id)-100) as bias from hy_payment) a order by a.bias) b
    where b.seq=1

    --2020-04-01--

  • 相关阅读:
    计算机为什么要从 0 开始计数?
    MySQL索引结构为什么是B+树
    expdp导出报错ORA-39127
    expdp 跳过坏块
    (转)没有索引导致的DIRECT PATH READ
    Python的实用场景有哪些
    Oracle索引修复 ,ORA-00600: internal error code, arguments: [6200],
    CentOS7.6静默安装19C实例脚本 ORA-27125 [FATAL] [DBT-10322]
    ORA-00313: 无法打开日志组
    cursor: pin S wait on X等待事件的处理过程(转载)
  • 原文地址:https://www.cnblogs.com/heyang78/p/12611767.html
Copyright © 2011-2022 走看看