这道SQL笔试题你会怎么写(转)

最近面试了一些Senior BI的候选人,行业经验三年到七年不等,起初觉得这个Level的无需准备笔试题,碍于领导执念,就在真实项目中提取5道SQL题目,这里仅单说其中一道难度中等偏下的题目,抛开面试不谈,单看笔试的话几轮下来答题情况并不理想,至今没有发现有人能写出逻辑滴水不漏又性能最大化的脚本,难点的题目甚至还有交白卷的情况,如果看官觉得这仅仅是茴香豆的茴几种写法的问题就飘过吧,我想通过题目考察的并非只是SQL的熟练程度,相对而言更看重候选人对数据的敏感程度,以及脚本性能的优化能力,往深了说就是要了解数据库存储引擎及查询优化器的工作原理,这是一个合格的BI从业者应有的基本素质。

题目是这样的,有一张ER图描述数据结构,这里就不贴图了,简单文字描述如下,劳烦看官各种脑补主外键关系:

一张会员表(account),字段有会员id(account_id), 会员卡号(account_num)。。。

一张交易订单表(trans),字段有会员id(account_id),交易时间(trans_time),交易金额(sales)。。。

要求查询出所有首笔订单的金额超过1000的会员卡号及其首笔订单金额,

注:

1. 首笔订单指的是每个会员交易时间最小的一笔订单

2. 会员表有一千万笔记录

3. 如果会员没有任何订单或者首笔订单金额<=1000,则首笔订单金额返回0。

下面提供三例典型的答题脚本供参考,候选人BI经验分别是三年,四年,六年,脚本笔录风格太过任性,因为题目没有约束DB产品,所以有使用各种DB私有函数的,有使用join的旧式写法的,甚至还有使用CTE的,状况百出,为照顾看官心情,在尊重原著本意的原则下梳理后的TSQL脚本如下:

A

select a.account_number, t.sales
from Account a
join
(
    select account_id, sales, min(trans_time)
    from trans
    group by trans_id
    having sum(sales)>1000
) t on a.account_id=t.account_id

B

select a.account_number, t.sales, rank() over(partition by a.account_id order by t.trans_time) rn
from account a
join trans t on a.account_id=t.account_id
where rn=1 and t.sales>1000
group by a.account_number,t.trans_time

C

Select a.account_number, t.sales
From Account a
left join
(
    Select account_id,sales,row_number() over(order by trans_time) rn
    From Trans
) t on a.account_id=t.account_id
where t.rn=1 and t.sales>1000

------------------------------------------------2014-12-05---------------------------------------------------------

虽然极力想要表达的是思维的严谨性,但经园友提醒还是发现真要是抠字眼的话,题目的描述也还是有不严谨的地方,例如第三个条件里说的首笔订单金额不足1000,竟然把等于1000这种情况漏掉了,目前为止统计答题情况如下:

想说点啥呢,我相信大家在机调试的话都能写出逻辑正确的代码,但很多场合下没有时间允许你反复调试代码,甚至有些逻辑错误是无法调试出来的,SQL里的row_number, where, order到底谁先执行,left join 后面的条件写在on后面还是where后面,不经意的写出来都可能是潜在bug,首先得保证数据逻辑正确无误,性能虽是次要,但糟糕的代码积累多了尾大不掉很容易拖垮整个DB,也是要格外小心的事情。

http://www.cnblogs.com/xpivot/p/4143069.html#!comments

sql 一些题目的更多相关文章

  1. 几道经典的SQL笔试题目

      几道经典的SQL笔试题目(有答案) (1)表名:购物信息 购物人      商品名称     数量 A            甲          2 B            乙        ...

  2. sql基础题目测试及正确答案

    在网上做了一套基本的sql题目,以下是我的写的答案,适合基础人员练练 --创建测试数据 use test create table Student(S# varchar(10),Sname nvarc ...

  3. Oracle sql 复习题目总结

    sql 题目一 表结构 1.表名:g_cardapply 字段(字段名/类型/长度): apply_no varchar8; //申请单号(关键字) apply_date date; //申请日期 s ...

  4. sql常见题目

    1 --student学生表(sno,sname,sex,birthday,tel) 2 --Course课程表(cno,cname) 3 --Sc 学生成绩表(sno,cno,score) 4 1. ...

  5. 一道关于比赛胜负的Sql查询题目

    以前做过一道题目,一直没有来得及总结下来.贴图: 记得以前曾经找到了两种方法,今天试了一下,还是可以的,贴出过程: 下面是具体的查询方法: 原来放的是图片,今天又练习了一下,附代码: create T ...

  6. SQL 测验题目(30道)

    1.SQL 指的是? 您的回答:Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? 您的回答:SELECT 3.哪条 SQL 语句用于更新数据库中的数据 ...

  7. Hive sql 经典题目和 复杂hsq

    案例一 练习:一:将下列数据加载hive表. 员工信息表emp:字段:员工id,员工名字,工作岗位,部门经理,受雇日期,薪水,奖金,部门编号英文名:EMPNO,ENAME,JOB,MGR,HIREDA ...

  8. hive SQL 初学者题目,实战题目 字符串函数,日期拼接,开窗函数。。。。

    sql:Hive实现按照指定格式输出每七天的消费平均数输出格式:2018-06-01~2018-06-07 12.29...2018-08-10~2018-08-16 80.67 答案:-- 1.先将 ...

  9. SQL练习题题目

    基本语法************************************************************************************************ ...

随机推荐

  1. js控制表单操作的常用代码小结

    收集了一些在WEB前台开发中常用的一些控制表单操作函数. 1.鼠标经过时自动选择文本鼠标划过自动选中:<input type="text" value="默认值&q ...

  2. 【Android】6.3 ProgressDialog

    分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 进度条对话框(ProgressDialog)常用于不能在短时间内快速完成的操作,显示进度条的目的是为了让用户明白程 ...

  3. 【Android】4.0 Android项目的基本结构

    分类:C#.Android.VS2015: 创建日期:2016-02-06: 修改日期:2016-02-27 一.简介 第3章虽然通过百度地图应用展示了你可能感兴趣的内容,但是,如果你是一个初学者,一 ...

  4. jQuery推断浏览器是移动端还是电脑端自己主动跳转

    一个段小代码.同一个站点针对移动端查看和电脑端查看跳转不同的页面. 首先载入jQuery文件. $(function(){ var MobileUA = (function() { var ua = ...

  5. mysql插入中文时候编码问题

    mysql插入中的时候要设置 set character_client_set = utf-8

  6. ie浏览器不兼容css媒体查询的解决办法

    有些页面布局复杂,在不同分辨率下表现需要一致,这时需要用媒体查询根据不同分辨率进行百分比定位(不能用像素定位),如: @media screen and (max-width: 1600px) { . ...

  7. angular学习笔记(十三)

    本篇主要介绍控制器的$scope中的数据是如何被改变的: 以下三种方法,都可以改变$scope中的number值: 1. 表达式: <span ng-click="number=num ...

  8. "高级"数据库小结

    刚刚考完高级数据库,这里有多高级等后面考完组合数学和算法再细聊.试卷在往年基础上改进了部分题目(貌似有人知道新题目的来源,如查询优化树),也可能是两份试卷交叉年份考.总之会的还是会,没看过的当然不会只 ...

  9. 每日英语:How to Be a Better Conversationalist

    Jason Swett still cringes when he remembers the party in Atlanta 10 years ago, where, drink in hand, ...

  10. Livepool

    LivePool Fiddler Like cross platform debugging proxy for web developers base on NodeJS LivePool 是一个基 ...