FB DS analytics 店面

今天下午刚面完,趁还没有忘记题目赶快来和大家分享一下,回报一下地里

和地里的面经大同小异,一上来先相互介绍一下自己,然后说一下为什么想来FB
介绍完就开始介绍今天的大致背景,SQL和product题目都是围绕ad4ad这个平台。简单来说ad4ad就是FB会找到在FB post里面卖东西的一些人,然后联系这些人给他们创造一个广告空间,在给这些user创造广告空间的同时FB会有potential loss或者cost because FB could spent money on other advertisers, instead of targeting potential advertisers
介绍完背景就开始SQL了,两个table如下:
table a: date|event(’‘impression’’,’‘click’’,’‘create_ad’’)|user_id|item_id|cost|spend
table b: user_id|country|date

table a介绍:event有三个值,其中impression就是FB为user创造的广告space,click代表user点进去了,create_ad代表user点进去之后正式create了ad。然后cost就是FB为这个user的这个item创造广告space所花费的cost,spend就是在user create_ad之后pay给FB的,所以只有create_ad那一行的spend不是null
第一题:number of users that FB has invited in the last 30 days for each country
不难,只需要a left join b 然后group by country就可以
第二题:avg number of impressions per user per item before user creates ad
这道题稍微有点绕,但是仔细想一下也就想出来。先写个subquery,需要将table a自己join一下,然后找同时是impression和create_ad的record,最后group by user,item;写完subquery再用一个AVG就可以了。做完之后有个follow up question,问avg 有什么不好的地方

product:list few metrics related to ad4ad, why these metrics. If one metric goes down, what is the reason?

能回忆起来的差不多就这些了,希望能对大家有帮助,也希望自己onsite能好好发挥

补充内容 (2018-11-1 02:31):
再说一下关于product的问题,如果一个metric go down了,大家不仅仅要break down the metric from user perspective(e.g. country, device, etc), 同时要想到这个metric是怎么算的,denominator和numerator是什么

补充内容 (2018-11-1 02:33):
metric下降可能是numerator变小了,可能是什么原因导致;然后denominator增加有可能是什么原因导致。还有如果别的创造广告的途径的收入下降了,对ad4ad好不好呢,可能会有什么影响呢等等,总之问的很细

第二题SQL我的写法是:

select avg(num_impression) as avg_impression
(select user_id, item_id, sum(case when event=’‘impression’’ then 1 else 0 end) as num_impression
from table a
where user_id in
(select distinct user_id from table a where event = ‘‘create_ad’’)
group by user_id, item_id) temp;

这里我直接assume一个user creates ad前一定有impression.

请问楼主SQL第二题能用来当后面case的metric吗?如果把avg改成median的话

谢谢!
楼主能介绍下自己背景吗!

楼主可以说一下第二题怎么找同时是impression和create_ad的record吗?没看懂这个地方。。谢谢!

恭喜楼主~ 祝onsite顺利
问一下SQL,

  1. 那个invite就是FB show出的那个impression吗? 所以只要left join 然后filter那个event = ‘‘impression’’, 然后count就可以了?
  2. 第二题还记得答案吗?能不能分享一下,我思路有点堵住了=-=,是说subquery出event只有impression和create_ad, 然后在这个基础上avg(impression)? 也就是说只要考虑user不仅有impression还要最后create_ad的平均值就可以了?AVG 不好是不是因为这个值本身看不出什么所以然?

Produc 你是怎么答的?metric是啥,我只能想到CTR和conversion
谢谢啦~

在职跳槽,差不多一年工作经验

如果我没记错的话应该是

  1. SELECT a.country, COUNT(DISTINCT a.user_id) AS num_users
    FROM a LEFT JOIN b
    ON a.user_id = b.user_id AND DATEDIFF(a.date, CURDATE()) <= 30
    GROUP BY a.country

SELECT AVG(sub.num_impression) AS avg_imp
FROM (SELECT a.user_id, a.item_id, SUM(CASE WHEN a.event = ‘‘impression’’ AND b.event IS NOT NULL THEN 1 ELSE 0 END AS) num_impression
FROM table_a a JOIN table_a b
ON a.user_id = b.user_id AND a.item_id = b.item_id AND a.event = ‘‘impression’’ AND b.event = ‘‘create_ad’’
WHERE a.date < b.date
GROUP BY a.user_id, a.item_id) sub
大致就是这样的,然后avg就说不够robust to outliers,可以考虑用median

metric 还可以提到revenue per targeted user

多谢解答~ 明白了~~

手动,请问楼主没有算法题吗

第一题:
以tablea为基准,left join b来得到country。
select b.country, count(distinct a.use_id)
from tablea a left join tableb b on a.user_id = b.user_id
where a.date >= date_sub(current_Date(), 30) group by b.country;
第二题:
我就count了有CREATE AD record的 UserID&ItemId pair 的Impression record数量。
select avg(sub.cnt) from
(select user_id, item_id, count(case when event = ‘‘impression’’ then 1 else 0 end) as cnt from tablea where concat(user_id, item_id) in (select concat(t.user_id, t.item_id) from tablea t where t.event = ‘create_ad’)) sub;