【SQL技巧】面试遇到不会写的SQL题怎么办?
背景
找大数据开发工作的同学,在面试过程中会遇到两种情况:
-
面试官只要求你写两道算法题
-
面试官不但要求你写算法题,还要你写SQL题
但咱们大部分都是Java算法题选手,SQL题练习的次数太少了,非常有可能遇到不会写的SQL,那该怎么办呢?
解决办法
这里老刘说个取巧的办法,这个办法帮助老刘顺利通过了多轮面试,但是不保证对每个人都用,具体情况具体分析!
以老刘的亲身经历为例,有好几次遇到了不会写的SQL,我当时这样给面试官说:
老刘:“面试官,我平时主要以算法题为主,没怎么练习过SQL题,这个SQL题我可不可以用Java的形式给它写出来?”
面试官有点惊讶,说:“那你用Java把这道题写出来吧!”
那面试官给我们机会了,我们就一定要抓住这次机会!如果我们真的用Java把这道SQL题写出来了,还有继续面试的希望,如果没有写出来,就很有可能面试不通过!
举例
下面给大家举几个SQL转Java的例子!
例子1
(某中厂二面题)假如HDFS上有一份数据文件,这份数据文件存储了用户数据关系,内容如下:
user1 | user2 | ts |
---|---|---|
a | b | 1000 |
a | c | 1001 |
c | d | 1002 |
a | e | 2000 |
请输出最近三十天内活跃用户的记录(假设今天时间是2001,最近三十天就是2001-30 ~ 2001),结果如下:
user1 | user2 | ts |
---|---|---|
a | b | 1000 |
a | c | 1001 |
a | e | 2000 |
解析:
这个SQL意思就是在1971~2001之间,求活跃用户的记录?
当时面试官这样要求:
首先最后一行a,e,2000肯定在这个区别,并且a和b有联系需要算在答案内,a和c有联系也需要算在答案内。
当时我真不知道怎么写,我就说能不能用Java解决?
public class leetcode666 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a,b,1000"); list.add("a,c,1001"); list.add("c,d,1002"); list.add("a,e,2000"); int ts = 2000; Set<String> users = new HashSet<>(); List<String> list1 = new ArrayList<>(); for (String s : list) { String[] tmp = s.split(","); if (2001 - Integer.parseInt(tmp[2]) <= 30) { String tmp1 = tmp[0]; String tmp2 = tmp[1]; users.add(tmp1); users.add(tmp2); } } for (String s : list) { String[] tmp = s.split(","); if (users.contains(tmp[0]) || users.contains(tmp[1])) { list1.add(s); } } System.out.println(list1); } }
例子2
用java如何实现SQL中的Join?
解析:
//写一个伪代码,这个题也是老刘自己总结的类型 List<Object1> list1 = new ArrayList<>(); List<Object2> list2 = new ArrayList<>(); //实现object1.id = object2.id List<Object3> list3 = new ArrayList<>(); for (Object1 obj1 : list1) { boolean found = false; for (Object2 obj2 : list2) { list3.add(new Object3(obj1, obj2)); found = true; } if (!found) { list3.add(new Object3(obj1, null)); } }
总结
这种方法属于在面试过程中投机取巧,如果平时有空记得也要刷刷SQL题,不要只刷算法题。
如果遇到实在不会写的SQL题,那可以尝试给面试官说明一下情况,请求用Java解决这道SQL题。
#面经##实习面经##大数据#