两道SQL面试题

suncrafted 2009-06-09 11:18:20
今天在sql server版上看到2到SQL面试题,有难度,而且看到了sql server下的解决方法,不知道ORACLE下有无相应的解决办法。
原帖参见:http://topic.csdn.net/u/20090608/21/A1FC1E88-83C4-4846-B640-ACE9FAD39D3D.html

注:在oracle11g中,已经提供了行转列和列传行的函数,pivot/unpivot,详细用法可百度下
------------------------------------------------------------------------------------
第一是.关于加班时间的问题
公司规定一周内最多只能加班和12个小时,多余的要去掉,去掉的规则是:某天加班超过1H的才能去,而且是依次大致平均的去,(最小单位是1小时)

举例:

日期 工号 加班小时
周一 A001 6
周二 A001 2
周三 A001 1
周四 A001 5
周五 A001 7
----------------
共计加班:21H,超出9H

从周一开始依次删减,每天减1H(如果当天的加班时间>1H),一轮后如果还不够,再继续下一轮,直到刚好为12H为止(只对超过12H的而言)

最后的结果应该是:
日期 工号 加班小时
周一 A001 3 --减了3次
周二 A001 1 --减了1次
周三 A001 1 --减了0次
周四 A001 2 --减了3次
周五 A001 5 --减了2次
-----------------------
以上只列具体某一个人的,公司有好几千人,
用SQL语句实现,考虑到效率问题规定:
1.不能用游标
2.不能用循环
其它方法都可以

第二题.求二者的关系
男A与女B结婚生了男C
男X与女Y结婚生了女Z
男C与女Z结婚...
这就是人间的结婚生子一代传一代的关系
(要考虑一人多次结婚的情况)

目的:
设置Table,栏位自定,
写一SQL函数求出若干年前后的任意两人之间的关系,假定身份证号码不重复,当输入两身份证后就能得出他们的关系
...全文
426 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨青 2009-10-10
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 inthirties 的回复:]
引用 9 楼 suncrafted 的回复:
引用 6 楼 hyee 的回复:

上面的SQL还是有点问题的。

SQL code
SELECT * FROM T
MODEL PARTITION BY(A,Y)
DIMENSION BY(X)
MEASURES (Z S1,Z S)
RULES ITERATE (10000) UNTIL (s[0] <= 12) (
  S[x>0] ORDER BY x=Greatest(s[cv()]-1,1)+greatest(sign(12-SUM(S)[x>0]+decode(s[cv()],1,0,1)),0),
  S[0]=SUM(S)[x>0]);

已经测试,这个是正确的,学习了。

不知道第二道题目有高手做出来了吗?


太有才了

[/Quote]
牛人
suncrafted 2009-06-22
  • 打赏
  • 举报
回复
再顶上去
csuxp2008 2009-06-19
  • 打赏
  • 举报
回复
高手啊,来学习了,看不懂
suncrafted 2009-06-19
  • 打赏
  • 举报
回复
顶一下。

期待第二题的解法。。。。。。。。。。。。。。。。。。。。
renrjs 2009-06-19
  • 打赏
  • 举报
回复
学习
taotie1225 2009-06-18
  • 打赏
  • 举报
回复
牛牛叉
pathuang68 2009-06-18
  • 打赏
  • 举报
回复
值得研究
wjwwj33 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 suncrafted 的回复:]
引用 6 楼 hyee 的回复:
上面的SQL还是有点问题的。

SQL code
SELECT * FROM T
MODEL PARTITION BY(A,Y)
DIMENSION BY(X)
MEASURES (Z S1,Z S)
RULES ITERATE (10000) UNTIL (s[0] <= 12) (
S[x>0] ORDER BY x=Greatest(s[cv()]-1,1)+greatest(sign(12-SUM(S)[x>0]+decode(s[cv()],1,0,1)),0),
S[0]=SUM(S)[x>0]);


已经测试,这个是正确的,学习了。

不知道第二道题目有高手做出来了吗?
[/Quote]

MARK
zhangyong369 2009-06-17
  • 打赏
  • 举报
回复
太牛叉了

学无止境啊
suncrafted 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zhufenghappy 的回复:]
有时候面试题就是变态不实际呵呵
[/Quote]

是啊。
zhufenghappy 2009-06-17
  • 打赏
  • 举报
回复
有时候面试题就是变态不实际呵呵
inthirties 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 suncrafted 的回复:]
引用 6 楼 hyee 的回复:

上面的SQL还是有点问题的。

SQL code
SELECT * FROM T
MODEL PARTITION BY(A,Y)
DIMENSION BY(X)
MEASURES (Z S1,Z S)
RULES ITERATE (10000) UNTIL (s[0] <= 12) (
  S[x>0] ORDER BY x=Greatest(s[cv()]-1,1)+greatest(sign(12-SUM(S)[x>0]+decode(s[cv()],1,0,1)),0),
  S[0]=SUM(S)[x>0]);

已经测试,这个是正确的,学习了。

不知道第二道题目有高手做出来了吗?
[/Quote]

太有才了
qin_phoenix 2009-06-17
  • 打赏
  • 举报
回复
学习
oraclelogan 2009-06-17
  • 打赏
  • 举报
回复
呵呵,关注下,回去研究下。
SIRIUS_ORA 2009-06-17
  • 打赏
  • 举报
回复
菜了都,用了一年多ORACLE愣是没看明白那个高手写的是什么东东,郁闷......
有没有那个大侠给解释下啊!
argl521 2009-06-17
  • 打赏
  • 举报
回复
太牛了! 学习了
oonxt 2009-06-16
  • 打赏
  • 举报
回复
召唤小狗旺财
thesecretblue 2009-06-16
  • 打赏
  • 举报
回复
up!!!
inthirties 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wangduokai 的回复:]
DBA面试吗
[/Quote]

应该是pl/sql开发的面试ba
王铎开 2009-06-16
  • 打赏
  • 举报
回复
DBA面试吗
加载更多回复(21)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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