一道著名的号称微软的试题的oracle解

原创 2004年07月04日 15:58:00

 

TABLE如下
日期 收入 支出
2000/3/1 50 30
2000/3/2 45 60
2000/3/5 60 10

能否用SELECT語句得出以下結果

日期 收入 支出 余額
2000/3/1 50 30 20
2000/3/2 45 60 5
2000/3/3 0 0 5
2000/3/4 0 0 5
2000/3/5 60 10 55

这是一个网上广为流传的题目,以前曾经有人说这是微软的试题,这个不去管了,我们先看oracle的解

SQL> select * from test;

A B C
---------- ---------- ----------
1 1 0
2 2 1
4 4 2
6 1 3
8 4 4

已用时间: 00: 00: 00.00
SQL> select tt1.tta,tt1.ttb,tt1.ttc,sum(tt2.ttb) - sum(tt2.ttc) youwant
2 from
3 (
4 select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
5 from
6 (select ((select min(a) from test) + rownum - 1) aa from all_objects
7 where rownum <= (select max(a) - min(a) +1 from test)) t1,
8 test t2
9 where t1.aa = t2.a(+)
10 ) tt1,
11 (
12 select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
13 from
14 (select ((select min(a) from test) + rownum - 1) aa from all_objects
15 where rownum <= (select max(a) - min(a) +1 from test)) t1,
16 test t2
17 where t1.aa = t2.a(+)
18 ) tt2
19 where tt1.tta >= tt2.tta
20 group by tt1.tta,tt1.ttb,tt1.ttc;

TTA TTB TTC YOUWANT
---------- ---------- ---------- ----------
1 1 0 1
2 2 1 2
3 0 0 2
4 4 2 4
5 0 0 4
6 1 3 2
7 0 0 2
8 4 4 2

已选择8行。

已用时间: 00: 00: 00.00

 

816 以上版本使用analistic function 的简化版答案

SQL> select * from test;

A B C
---------- ---------- ----------
5 5 5
2 2 1
4 4 5
6 1 3
8 4 4

SQL> select tt2.tta, tt2.ttb, tt2.ttc, sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
2 from
3 (
4 select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
5 from
6 (select ((select min(a) from test) + rownum - 1) aa from all_objects
7 where rownum <= (select max(a) - min(a) +1 from test)) t1,
8 test t2
9 where t1.aa = t2.a(+)
10 ) tt2;

TTA TTB TTC YOUWANT
---------- ---------- ---------- ----------
2 2 1 1
3 0 0 1
4 4 5 0
5 5 5 0
6 1 3 -2
7 0 0 -2
8 4 4 -2

已选择7行。

SQL>

 

        其实这类问题都是月度微通解的,主要就是构造连续的数字集合,如果all_objects记录数不足完全可以做个自连接。比如曾经有求某段时间内的工作日天数,这类问题,也是如此解法。

 

 

 

 

一道很不错的js面试题

function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function...
  • java_goodstudy
  • java_goodstudy
  • 2016年12月04日 01:42
  • 1041

一道微软笔试题

题目2 : Numeric Keypad 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The numberic ke...
  • u014112277
  • u014112277
  • 2015年04月25日 15:16
  • 278

一道微软笔试题

算法思路:先将链表后半部分逆序
  • NicolasYan
  • NicolasYan
  • 2014年11月24日 09:34
  • 569

近几年微软笔试题汇总分类解析

作者:寒小阳 时间:2013年10月。 出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251。 声明:版权所有,转载请注明出处...
  • yaoqiang2011
  • yaoqiang2011
  • 2013年10月11日 16:52
  • 4379

遗传算法解一道笔试题

题目大意如下: 有N个房间,通过N-1个门相连(每个房间的门数在1到3之间),现在有M个路由器,需要把M个路由器放置在其中一些房间中,使得放置路由和其周围的房间能收到wifi信号(假如一个房间放置了...
  • WayToAccept
  • WayToAccept
  • 2016年10月18日 09:52
  • 286

微软的软件测试工程师——《微软的软件测试之道》

好多人极力推荐《微软的软件测试之道》这本书,于是在网上搜索了一番,英文版的阅读起来有难度,在51CTO上发现了前第二章和第三章中文的内容。     在这个世界顶级的企业里,软件测试工程是的测试是怎样...
  • zouhui1003it
  • zouhui1003it
  • 2017年01月13日 15:47
  • 346

微软2014校园招聘笔试试题

微软2014校园招聘笔试试题 1、Which statement(s) is(are) correct about thread and process?Select all that apply.(...
  • Hackbuteer1
  • Hackbuteer1
  • 2013年09月30日 12:04
  • 31628

每天一道C\C++笔试题V---内存泄露

俗语云:出来混,迟早是要还的。 下面是一道初级内存泄露题,程序员小懒儿显式的用new动态分配了内存,却忘记了用delete释放。 请找出问题的所在,代码如下: #include #incl...
  • lincyang
  • lincyang
  • 2013年03月07日 22:08
  • 3746

Oracle笔试题

一、单选题 1. Oracle发出下列select语句: SQL> select e.empno, e.ename, d.loc from emp e, dept d where e.dept...
  • xq2768637066
  • xq2768637066
  • 2016年02月19日 13:24
  • 7613

Oracle笔试题(答案)

一、选择题(每题1分)   A Oracle发出下列select语句: SQL> select e.empno, e.ename, d.loc    2 from emp e, dept d ...
  • wxy_kk
  • wxy_kk
  • 2017年03月11日 11:01
  • 1580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一道著名的号称微软的试题的oracle解
举报原因:
原因补充:

(最多只允许输入30个字)