oracle 数据仓库面试题,亚信数据仓库面试题一道

在亚信面试数据仓库工程师,碰见一位高人,给我出了道sql的考题,拿出来和大家分享一下,表如下:

年龄维:

id subl_id age_min age_max age_desc sub_desc

1     1        1      15     1-15    1-10

1     2        1      15     1-15    11-15

2     3        16     30     16-30   16-25

2     4        16     30     16-30   26-30

3     5        30     45     30-45   30-45

......

事实表:

cust_id sex age deposit

1        1   7   300

2        2   20  30

3        1   16  300

4        1   39  20

.....

要求写出,性别为1,年龄小于50,按照age_desc分组计算的客户数,sum(deposit)和average(deposit),我看了后觉得表设计不合理,sql很难写。该大侠竟然拿我当小孩一般训斥了一番,眉宇间一副你这种水平也敢来亚信的样子。call,我这里给大家写出我的设计,请各位看看究竟是谁的合理些。

日期维:

range_id year_id year_range year

1         1      1900-1959  1900

....

1         60     1900-1959  1959

2         61     1960-1969  1960

..

2         70     1960-1969  1969

3         71     1970-1979  1970

....

3         80     1970-1979  1979

4         81     1980-1989  1980

....

4         90     1980-1989  1989

5         91     1990-1999  1990

....

5         100    1990-1999  1999

....

事实表:

cust_id sex year_id deposit

1        1   66      300

2        2   81     30

3        1   73     300

4        1   54     20

以上用日期维替换了年龄维,事实表中用year_id替换了age,当然这个日期维比较简单,而且我也没有完全照他的年龄范围来划分,但是思路就是这样。如果把year字段改成yyyymmdd,则该维还可以扩展到,周,旬,季度,年度等等。

其实我的思路很简单,就是年龄不应当作为字段存在,因为他是变动的,而且是可计算的。该大侠的解释是他们会定时更新事实表的年龄字段,更新数据仓库?我晕倒!!!

其实好的数据库设计可以让sql编写变得很简单,而且性能也会好,差的数据库设计不仅让sql编写异常困难,而且导致其效率低下。可叹的是某些人还偏要拿他们那蹩脚的sql自得,而不去考虑一下设计上的缺陷!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值