楼主: 蓝带鱼

(转贴)微软的面试题 sql

[复制链接]
论坛徽章:
25
ITPUB元老
日期:2005-02-28 12:57:00管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
31#
发表于 2001-11-24 21:08 | 只看该作者
最初由 zchen88168 发布
[B]If it is from Microsoft, the first column in the table should be an ID column (Primary Key column). Also I created a table named test_balance with 4 columns. BalanceID is PK (Idenity column). GroupID is int. BalanceDate is datetime.  Amount is money.

Tehn following QUERY works. I tested on SQL Server. May need performance improved. Hav a try and get fun.

select tb1.balanceid, tb1.balancedate, tb1.groupid, tb1.amount
        from test_balance  tb1 where tb1.balanceid in
(select max(tb2.balanceid)  bid1
        from test_balance  tb2
        group by tb2.groupid) [/B]



呵呵,这样的问题我喜欢

sqlserver我不熟  不过问题的关键是,如果某天没发生支出是没有记录的,那么它的余额从哪儿来呢? 简单group by肯定不行, 需要有一个记录全部时间的表连接获得
比如考虑题目中包含的一个极端情况: 100天内没有任何支出记录, 那么你怎么得出结果?

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
32#
 楼主| 发表于 2001-11-26 10:43 | 只看该作者
对,这道题的关键在于,只有每次支出的时候才插入一条记录,不支出是没有记录的。而且每天的支出记录可能不只一条。
而题目又要求输出每个帐户每一天的记录,既结果必须是100*100共一万条记录。所以要费脑筋哦!

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
33#
发表于 2001-11-26 15:44 | 只看该作者
微软的答案就是。。。。。。。。

没做过的,就不会做,给你2小时也一样

做过的,2分钟,就把答案背出来了




假如每个应聘者 都那么 天才的话,俺么就知难而退
此类拗口的题目,当作 趣味竞赛 还差不多,哼哼,明显 想要打击应试者的气焰,让人家知道他们的利害

fxxxxxxk

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:332009新春纪念徽章
日期:2009-01-04 14:52:282013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
34#
发表于 2001-12-5 03:27 | 只看该作者
最初由 oldwain 发布
[B]下午的语句经过考虑和测试, 证明有错误.
以下为经过测试的语句.

表结构:
[php]
create table trade_test (
        t_date date, -- 时间
        t_id varchar2(6), -- 用户
        t_c number(5) ) -- 余额
/
[/php]

测试样例:

INSERT INTO TRADE_TEST VALUES ( SYSDATE - 100, 'ABC', 100);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 100 + 1/24, 'ABC', 95);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 90, 'ABC', 90);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 90+ 1/24, 'ABC', 85);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 50, 'ABC', 50);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 30, 'ABC', 30);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 30 + 1/24, 'ABC', 25);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 10, 'ABC', 10);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 1, 'ABC', 5);
---
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 100, 'XYZ', 100);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 100 + 1/24, 'XYZ', 95);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 90, 'XYZ', 90);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 90+ 1/24, 'XYZ', 85);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 50, 'XYZ', 50);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 30, 'XYZ', 30);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 30 + 1/24, 'XYZ', 25);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 10, 'XYZ', 10);
INSERT INTO TRADE_TEST VALUES ( SYSDATE - 1, 'XYZ', 5);
COMMIT;


语句:
[php]
select v_id, to_char(v_date, 'YYYY-MM-DD'), min(v_c)
from
        (select v_id, v_date,
                NVL(VALL.t_c,
                        (        select t_c
                                from trade_test A
                                where A.t_id = VALL.v_id
                                and t_date =
                                        ( select max(t_date)
                                        from trade_test B
                                        where B.t_id = VALL.v_id and B.t_date <=

VALL.v_date
                                        )
                        )
                ) v_c
         from
                (
                        select vdid.v_date, vdid.v_id, tt.t_c
                        from         (
                                        select distinct vd.v_date, vid.v_id from
                                        (        select (sysdate - rownum) v_date
                                                from all_objects where rownum < 101
                                                union select distinct t_date v_date from

trade_test
                                        ) vd,
                                        (select distinct t_id v_id from trade_test) vid
                                ) vdid, trade_test tt
                        where vdid.v_date = tt.t_date(+)
                        and vdid.v_id = tt.t_id (+)
                ) VALL
        )VMIN
group by v_id, to_char(v_date, 'YYYY-MM-DD')
;
[/php]

说明:
vd: 形成一百天的日期与已有数据中日期的一个并集
vid: 所有的id号
vdid: 日期集合与id集合的一个笛卡儿集
VALL: 所有id所有日期的余额(无值的记录对应余额为null值)
VMIN: 将所有null值替换为最后一笔的余额
有了以上说明, 相信应该比较容易读懂, 不再分解.

语句在样例数据上测试正确(环境: oracle 8.17 + win2000 pro) . 由于篇幅所限, 不在列出测试结果, 朋友们可以自行测试.


语句未考虑优化, 有兴趣的朋友可以提出更好的解决方法. 如有错误, 请指正. [/B]

你的DML中的SYSDATE不一定与VD中的SYADATE是同一值,因此UNION后的结果大于你所期望的集的长度.

使用道具 举报

回复
论坛徽章:
0
35#
发表于 2008-8-21 00:05 | 只看该作者
楼上有错.如果数据是下面的示例,不可通过。
1        2008-8-1        100
2        2008-8-1        100
3        2008-8-1        100
4        2008-8-1        100
5        2008-8-1        100
1        2008-8-2        90
1        2008-8-2        70
3        2008-8-2        70
4        2008-8-5        60
5        2008-8-4        50

使用道具 举报

回复
论坛徽章:
0
36#
发表于 2008-8-21 00:06 | 只看该作者
declare
  res ACCT%rowtype;
begin
  for i in 1 .. 5 loop
    for j in 0 .. 4 loop
      begin
        SELECT a.acctid, a.bdate, min(a.balance)
          into res
          FROM ACCT A
         where a.bdate = to_date('20080801', 'yyyymmdd') + j
           and acctid = i
         group by a.acctid, a.bdate
         order by acctID, BDate;
      exception
        when NO_DATA_FOUND THEN
          SELECT a.acctid, to_date('20080801', 'yyyymmdd')+j , min(a.balance)
            into res
            FROM ACCT A
           where acctid = i
             and a.bdate =
                 (select max(bdate)
                    from acct
                   where acctid = i
                     and bdate >= to_date('20080801', 'yyyymmdd') and  bdate <=to_date('20080801', 'yyyymmdd')+j)
           group by a.acctid,  BDate
           order by acctID, BDate;
      END;
      dbms_output.put_line(res.acctid || '     ' ||
                           to_char(res.bdate, 'yyyymmdd') || '     ' ||
                           res.balance);
    end loop;
  end loop;
end;

使用道具 举报

回复
论坛徽章:
0
37#
发表于 2008-8-21 00:07 | 只看该作者
create table ACCT(
acctID varchar2(3),
BDate date not null,  
BALANCE number not null
);
--2、(20分)一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,
--请输出每天所有账户的余额信息,使SQL
测试数据:
1        2008-8-1        100
2        2008-8-1        100
3        2008-8-1        100
4        2008-8-1        100
5        2008-8-1        100
1        2008-8-2        90
1        2008-8-2        70
3        2008-8-2        70
4        2008-8-5        60
5        2008-8-4        50

使用道具 举报

回复
论坛徽章:
0
38#
发表于 2008-8-21 00:07 | 只看该作者
测试结果:
1     20080801     100
1     20080802     70
1     20080803     70
1     20080804     70
1     20080805     70
2     20080801     100
2     20080802     100
2     20080803     100
2     20080804     100
2     20080805     100
3     20080801     100
3     20080802     70
3     20080803     70
3     20080804     70
3     20080805     70
4     20080801     100
4     20080802     100
4     20080803     100
4     20080804     100
4     20080805     60
5     20080801     100
5     20080802     100
5     20080803     100
5     20080804     50
5     20080805     50

[ 本帖最后由 linbren 于 2008-8-21 00:12 编辑 ]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
39#
发表于 2011-12-30 01:42 | 只看该作者
oldwain 发表于 2001-11-23 22:04
下午的语句经过考虑和测试, 证明有错误.
以下为经过测试的语句.

对老old在2001年能写出这么复杂的sql表示由衷的敬佩

使用道具 举报

回复
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:27:27鲜花蛋
日期:2012-05-18 10:08:552015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39知识
日期:2015-08-31 09:57:17
40#
发表于 2012-2-20 21:53 | 只看该作者
lastwinner 发表于 2011-12-30 01:42
对老old在2001年能写出这么复杂的sql表示由衷的敬佩

这老帖是你放上来的吧。。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表