求支付表中按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('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
首先把从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('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('','');
insert into hy_payment(id,pay) values('',''); 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--
求支付表中按id累积和最接近100的那条记录的更多相关文章
- 删除数据表中除id外其他字段相同的冗余信息
删除一个信息表中除id外其他字段都相同的冗余信息,如下 id name addr 1 a b 2 a b 3 b c 删除这个表中的冗余信息 即应该是 id name addr 1 a b 3 b c ...
- 一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数
一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数 select id ,Count(*) from table_name group by id having count( ...
- 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据
我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...
- SqlServer中怎么删除重复的记录(表中没有id)
SqlServer中怎么删除重复的记录(表中没有id) 其实我在别的网址也查到过删除重复的记录,不知道我是我SqlServer2012版本太低还是啥原因 delete from scwhere (c# ...
- B表中的pid对应A表中id,查询A表中数据,根据b表中对应a表中该id的数据数目排序
B表中的pid对应A表中id,查询A表中数据,根据b表中对应a表中该id的数据数目排序 select a.*,count(*) as c from a left join b on a.id=b.ai ...
- mysql过滤表中重复数据,查询相同数据的特定一条
待操作的表如下: p.p1 { margin: 0; font: 16px Menlo; color: rgba(0, 0, 0, 1) } span.s1 { font-variant-ligatu ...
- 在已有数据的表中添加id字段并且自增
各位大牛,小弟在开发过程中,遇到了这样一个问题,由于新功能的增加需要使原有的一张表的结构作出调整,需要添加一个id主键字段,但是因为表里有很多数据了,所以,怎样才能添加这个字段,并且使原有的数据也能够 ...
- sqlserver 删除表中数据 id 从1开始
TRUNCATE TABLE TbName --TbName是表名 但如果TbName中某些字段与其它表有主外键关系,会报错: 无法截断表 'Plants',因为该表正由 FOREIGN KE ...
- 表中排序ID断开重排
客户需要排序ID和页面的问题序号一致,以前删除过一些问题导致order_id 中间有些断开的. 业务表 T_QUESTION order_id question_id custom_id --1.创 ...
随机推荐
- 综合CSS3 transition、transform、animation写的一个动画导航
打算好好写博客开始,就想把博客给装修下,近几个月一直处在准备找工作疯狂学习前端的状态.感觉博客装修要等到工作稳定下来才有时间和经历去想想要搞成什么样的了.也看过一些博主的博客导航有这种样式的,趁着回顾 ...
- AlgorithmMan,一套免费的算法演示神器
概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/971 访问. 文章末尾附带GitHub开源下载地址. 0.概述 ...
- C#LeetCode刷题-脑筋急转弯
脑筋急转弯篇 # 题名 刷题 通过率 难度 292 Nim游戏 62.5% 简单 319 灯泡开关 31.8% 中等 777 在LR字符串中交换相邻字符 21.9% 中等
- Kubernetes用Helm安装Ingress并踩一下使用的坑
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Ingress是Kubernetes一个非常重要的Controller,它类似一个路由转发的组件,可以让外界访问Kubern ...
- JavaScript基础-03
1. 条件判断语句 若条件成立才会执行,条件不成立则语句不执行: if语句 语法一: if(条件表达式) {语句} :true就执行,false不执行: 语法二: if(条件表达式) ...
- Ng-Matero V10 正式发布!
Angular v10 在六月下旬就悄无声息的发布了,虽然 v9 的发布延期了两个月,但是 v10 并没有受影响,仍然如期而至. 相比 v9 的重量级发布,v10 并没有颠覆性的变化,主要还是 bug ...
- EXCEL 中数据 批量 填充进 word 中
工具:Python3.7 需求描述:将EXCEL中 第二行 数据 填在 word 对应位置上,然后保存为 "姓名+任务.docx"文件. 再将EXCEL中 第三行 数据 填在 wo ...
- WIN10家庭版安装ORACLE的问题
第一次安装成功后可启动ORACLE服务,重启计算机后服务监听无法启动,建议替换系统
- netbox demo
参考链接:https://pypi.org/project/python-netbox/ # python 参考链接 https://ttl255.com/pynetbox-netbox-python ...
- 使用分区挂载 ftp 目录
ftp挂载分区上去后无法识别的问题困扰了我好几天,今天有时间把它研究了一下,拿出来与大家分享一下. ftp目录挂载分区前与挂载分区后的区别[root@localhost ~]# ls -Zd /var ...