传说中的谷歌招聘委员会成员之一,从幕后走出来,教你学系统设计!


一亩三分地论坛

 找回密码
 获取更多干活,快来注册
天天打游戏、照样领工资、还办H1B
这份工作你要不要?
把贵司招聘信息放这里
查看: 4367|回复: 27
收起左侧

fb data scientist电面跪经

[复制链接] |试试Instant~ |关注本帖
LuckyGemini 发表于 2016-12-1 07:30:54 | 显示全部楼层 |阅读模式

2016(10-12月) 分析|数据科学类 硕士 实习@Facebook - Other - 技术电面 |Failfresh grad应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
对sql不是很熟,然后又很紧张,当场扑街了
问的问题是,给两个table 一个是request(sender_id,request_id,time)
还有一个是accepts(accept_id, request_id,time)
求acceptance rate
. from: 1point3acres.com/bbs
我用inner join on sender_id 他说不对……
然后求谁的朋友最多,我说从accepts table里选accept_id出现最多的
. visit 1point3acres.com for more.他说不对……
于是我就跪了……呜呜呜呜

评分

2

查看全部评分

miles0302 发表于 2017-2-4 16:58:56 | 显示全部楼层
小塔 发表于 2016-12-22 11:47
这样对么?.鏈枃鍘熷垱鑷1point3acres璁哄潧

1, select count(accept_id) from accepts/(select count(request_id) from requests as rati ...

一个request id 没有被accept 就不会有accept id。所以要request left join accepts. Left join 后如果一个request_id对应的行出现accept id 是null的话就是这个request没有被accept。不是null的行数除以总行数就是acceptance rate
回复 支持 3 反对 0

使用道具 举报

kurokubs 发表于 2017-3-28 13:08:38 | 显示全部楼层
drop table if exists request;
drop table if exists accept;

create table request(
  sender_id int,
  request_id int,
  time int. Waral 鍗氬鏈夋洿澶氭枃绔,
);.鏈枃鍘熷垱鑷1point3acres璁哄潧

create table accept(
  accept_id int,
  request_id int,
  time int. 1point 3acres 璁哄潧
);

. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
insert into request Values(1,13,101);-google 1point3acres
insert into request Values(1,14,102);
insert into request Values(2,113,1111);
insert into request Values(3,115,103);
insert into request Values(3,117,12321);
insert into request Values(3,118,12311);
. from: 1point3acres.com/bbs
insert into accept Values(5,13,101);
insert into accept Values(6,14,102);
insert into accept Values(7,115,103);
insert into accept Values(3,113,1111);
insert into accept Values(7,118,12311);.鏈枃鍘熷垱鑷1point3acres璁哄潧

--Q1;


SELECT SUM(CASE WHEN accept_id IS NOT NULL THEN 1 ELSE 0 END)/ CAST(COUNT(*) AS DECIMAL(9,2)) AS accept_rate
FROM
request a
LEFT JOIN
accept b
ON a.request_id = b.request_id AND a.time = b.time
;

-- Q2;-google 1point3acres
. 鍥磋鎴戜滑@1point 3 acres
.鐣欏璁哄潧-涓浜-涓夊垎鍦
SELECT t1.sender_id, (CASE WHEN t1.cnt IS NULL THEN 0 ELSE t1.cnt END) + (CASE WHEN t2.cnt IS NULL THEN 0 ELSE t2.cnt END) AS friend
FROM
(SELECT r1.sender_id, COUNT(*) as cnt FROM request r1 LEFT JOIN accept a1 on r1.request_id=a1.request_id AND r1.time = a1.time WHERE a1.accept_id IS NOT NULL GROUP BY r1.sender_id) t1
FULL OUTER JOIN
(SELECT a2.accept_id, COUNT(*) as cnt FROM request r2 LEFT JOIN accept a2 on r2.request_id=a2.request_id AND r2.time=a2.time WHERE a2.accept_id IS NOT NULL GROUP BY a2.accept_id) t2. 1point 3acres 璁哄潧
ON t1.sender_id = t2.accept_id
WHERE t1.sender_id IS NOT NULL
ORDER BY 2 DESC LIMIT 1. 1point 3acres 璁哄潧
;



回复 支持 0 反对 1

使用道具 举报

oliviajzma 发表于 2017-8-17 02:17:17 | 显示全部楼层
Aesculus 发表于 2017-5-11 05:10
第二道题为什么不能只看accept table? 难道只发了request还没被accept也算是朋友么?
我想的是:

我觉得你的思路是对的。但是我和你的做法不一样的是我union了之后再算一个SUM ,group by id。意思就是,如果小A发了4个request的同时接受了3个其他人给他发的request,那小A的朋友数是不是应该是7个呢?

# who has the most friends?.鏈枃鍘熷垱鑷1point3acres璁哄潧
SELECT id, SUM(count) as sum from
(
(SELECT sender_id AS id, COUNT(DISTINCT request_id) AS count . more info on 1point3acres.com
FROM request
GROUP BY sender_id)
UNION ALL
(SELECT accept_id AS id, COUNT(DISTINCT request_id) AS count
FROM accept
GROUP BY accept_id)
) x.1point3acres缃
GROUP BY id
ORDER BY sum DESC LIMIT 1.1point3acres缃

补充内容 (2017-8-17 02:53):
# friend acceptance rate (我觉得不用join date)
SELECT (COUNT(accept_id)/COUNT(*)) AS rate . from: 1point3acres.com/bbs
FROM request a LEFT JOIN accept b
ON (a.request_id = b.request_id);
回复 支持 1 反对 0

使用道具 举报

houqingniao 发表于 2016-12-1 08:13:12 | 显示全部楼层
不应该on request_id么
回复 支持 反对

使用道具 举报

MulinZz 发表于 2016-12-1 10:27:41 | 显示全部楼层
求问sql 的题目要如何准备。
回复 支持 反对

使用道具 举报

wendyhz2hu 发表于 2016-12-1 11:15:29 | 显示全部楼层
楼主我也同跪,遇到同样的问题
回复 支持 反对

使用道具 举报

在浙里 发表于 2016-12-1 11:23:46 | 显示全部楼层
楼主是什么专业的?
回复 支持 反对

使用道具 举报

linjunch 发表于 2016-12-1 12:26:41 | 显示全部楼层
1,select sum(case when accept_id is not Null the 1 else 0 end)/count(*) from request as r left join accepts as a on request_id and time
2,t1.request_id,t1.cnt1+t2.cnt2 as cnt_tot from (sel sender_id, count(*) as cnt1 from  request as r left join accepts as a on request_id and time where a.accept_id is not Null group by 1) as t1  left join (sel accept_id, count(*) as cnt2 from  request as r1 left join accepts as a1 on request_id and time where a1.accept_id is not Null group by 1)  as t2 on t1.sender_id=t2.accpet_id
order by 1 desc
回复 支持 反对

使用道具 举报

linjunch 发表于 2016-12-1 12:33:14 | 显示全部楼层
linjunch 发表于 2016-12-1 12:26
1,select sum(case when accept_id is not Null the 1 else 0 end)/count(*) from request as r left join  ...


1,select sum(case when accept_id is not Null the 1 else 0 end)/count(*) from request as r left join accepts as a on request_id and time
2,t1.request_id,t1.cnt1+t2.cnt2 as cnt_tot from (sel sender_id, count(*) as cnt1 from  request as r left join accepts as a on request_id and time where a.accept_id is not Null group by 1) as t1  outer join (sel accept_id, count(*) as cnt2 from  request as r1 left join accepts as a1 on request_id and time where a1.accept_id is not Null group by 1)  as t2 on t1.sender_id=t2.accpet_id
order by 2 desc 改了一下
回复 支持 反对

使用道具 举报

lha_1313 发表于 2016-12-1 14:02:19 | 显示全部楼层
fb的电面题三年都不带变的么。。
回复 支持 反对

使用道具 举报

raypeng 发表于 2016-12-1 14:13:04 | 显示全部楼层
我感觉面的时候我sql也很卡壳 结果过了 lz了解fb的ds么 希望可以聊聊
回复 支持 反对

使用道具 举报

小塔 发表于 2016-12-22 11:47:37 | 显示全部楼层
这样对么?

1, select count(accept_id) from accepts/(select count(request_id) from requests as ratio;

2, sender_id出现的次数 + accept_id出现的次数 full outer join on sender_id=accept_id ?
回复 支持 反对

使用道具 举报

LuckyJecci 发表于 2017-5-7 05:08:07 | 显示全部楼层
Q1:
SELECT (Count(accept_id)/ COUNT(*)) AS accept_rate
FROM accept. From 1point 3acres bbs

count(column)会不算NULL的,Count(*)算NULL
回复 支持 反对

使用道具 举报

atmoszh 发表于 2017-5-9 08:45:15 | 显示全部楼层
会有multiple request吧,所以应该需要dedup,即使变成朋友前所有request都只在database里存在一个,还有先成朋友后来又绝交了,后来又好了呢。我觉得time variable应该就是来identify这个的。还有算好友个数也是,一次好友接受了不代表永远都是好朋友哈,如果发现最后一个好友接受的时间点之后突然又有一个好友request(相同两个人),那说明当中他们绝交过一段儿吧。。。 不过如果面试官真的想考这些点的话确实有点过分了。。。
回复 支持 反对

使用道具 举报

Aesculus 发表于 2017-5-11 05:10:22 | 显示全部楼层
第二道题为什么不能只看accept table? 难道只发了request还没被accept也算是朋友么?
我想的是:

  1. select  t.id, sum(t.count) as friends.鏈枃鍘熷垱鑷1point3acres璁哄潧
  2. from (
  3.     (select sender_id as id, count(*) as count from accept group by sender_id)
  4.     union. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  5.     (select accept_id as id, count(*) as count from accept group by accept_id). 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  6. ) t
  7. group by t.id
复制代码

.鏈枃鍘熷垱鑷1point3acres璁哄潧
这样可以么?
回复 支持 反对

使用道具 举报

qiyahu 发表于 2017-5-12 10:03:58 | 显示全部楼层
感觉data scientist 不是sql就是sql
回复 支持 反对

使用道具 举报

iamchrisa 发表于 2017-5-23 10:15:33 | 显示全部楼层
有点儿疑惑为什么第一题sql是join的condition是time呢?
比如今天request 明天accept 这两个timestamp明显不一样。
另外第二题怎么定义friend个数呢?. 1point3acres.com/bbs
求解答~
回复 支持 反对

使用道具 举报

TinyBOYSH 发表于 2017-5-28 07:37:33 | 显示全部楼层
问的问题是,给两个table 一个是request(sender_id,request_id,time).1point3acres缃
还有一个是accepts(accept_id, request_id,time)
求acceptance rate
. more info on 1point3acres.com
第二题:
方法一:. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
SELECT sender_id, COUNT(request_id) AS num_friends
FROM request
WHERE request_id IN (SELECT request_id FROM accepts)
GROUP BY sender.id
ORDER BY num_friends DESC

方法二:(不许用subquery)
SELECT
FROM sender_id, COUNT(request_id) AS num_friends
(accepts LEFT JOIN requests ON accepts.request_id = request.request_id) as t. 1point3acres.com/bbs
GROUP BY sender_id
ORDER BY num_friends DESC
回复 支持 反对

使用道具 举报

NanaZhao 发表于 2017-8-24 04:50:11 | 显示全部楼层
lz 以及 ls 的各位亲, 谁给介绍下这个职位的要求什么的
面试只考了SQL吗?还对其他什么语言有要求吗?data scientist/analyst 上哪去刷题?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-9-25 16:21

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表