一亩三分地

 找回密码 注册账号

扫描二维码登录本站


Salarytics=Salary Analytics
查询工资数据
系统自动计算每年收入

码农求职神器Triplebyte
不用海投
内推多家公司面试

科技公司如何
用数据分析驱动产品开发
coupon code 250off 立减$250

深入浅出AB Test
从入门到精通
coupon code 250off 立减$250
游戏初创公司招聘工程师、UIUX Designer和游戏策划
坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
查看: 649|回复: 6
收起左侧

[其他] 刚上市打车公司 SQL 题

[复制链接] |试试Instant~
我的人缘0

分享帖子到朋友圈
Wu_kong | 显示全部楼层 |阅读模式
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (225)
 
 
7% (18)    👎

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

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
Input:
UserID, Event, TS
1, 1, 1
1, 2, 3
1,3, 35
1,4,40
...

Output:
UserID, session_start_ts, session_end_ts
1, 1, 3
1, 35, 40

大于30秒就是新的session。
这个题我也不会做, 大家集思广益一下吧

最后, 求加米

评分

参与人数 2大米 +7 收起 理由
waxixi + 2 很有用的信息!
14417335 + 5

查看全部评分


上一篇:面试题 找到 所有对话中的人
下一篇:分享基本电子书(C++, Python, 算法, 机器学习等)
我的人缘0
magicsets 2019-5-18 11:30:23 | 显示全部楼层
本楼: 👍   100% (2)
 
 
0% (0)   👎
全局: 👍   99% (804)
 
 
0% (8)    👎
如果对题目的理解是任意相差不超过30秒的Event都在一个Session里面的话可以用Window Function:https://www.db-fiddle.com/f/eHWnz5Ysd6FLRPP2g9Dksp/4

[SQL] 纯文本查看 复制代码
SELECT UserID,
       MIN(TS) AS SessionStartTS,
       MAX(TS) AS SessionEndTS
FROM (
  SELECT UserID, TS,
         SUM(BoundaryIndicator) OVER(
             PARTITION BY UserID ORDER BY TS) AS IntervalID
  FROM (
    SELECT UserID, TS,
           CASE WHEN TS - LAG(TS, 1, -100) OVER (
               PARTITION BY UserID
               ORDER BY TS) <= 30
           THEN 0 ELSE 1 END AS BoundaryIndicator
    FROM Events
  ) t
) t
GROUP BY UserID, IntervalID
ORDER BY UserID. SessionStartTs;


如果是另外一种理解,也就是一个Session最多30秒的话,可以用Recursive CTE:https://www.db-fiddle.com/f/eHWnz5Ysd6FLRPP2g9Dksp/3
时间复杂度上,除去排序所需的时间之外,递归部分可能是O(n)也可能是O(n^2),取决于底层引擎够不够聪明只建一次Events表上的hash table,不过MySQL的优化器应该是渣渣..

[SQL] 纯文本查看 复制代码
WITH RECURSIVE EventRn AS (
  SELECT *, ROW_NUMBER() OVER (
                PARTITION BY UserID ORDER BY TS) AS Rn
  FROM Events
),
Sessions(UserID, SessionStartTS, SessionEndTs, Rn) AS (
  SELECT UserID, TS, TS, Rn FROM EventRn WHERE Rn = 1
  UNION ALL
  SELECT E.UserID,
         CASE WHEN E.TS - S.SessionStartTs <= 30
              THEN S.SessionStartTS ELSE E.TS END,
         E.TS, E.Rn
  FROM Sessions S, EventRn E
  WHERE E.UserID = S.UserID AND S.Rn + 1 = E.Rn
)
SELECT UserID, SessionStartTS, MAX(SessionEndTS)
FROM Sessions
GROUP BY UserID, SessionStartTS
ORDER BY UserID, SessionStartTS;
回复

使用道具 举报

我的人缘0
zidduu 2019-5-18 06:35:58 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (20)
 
 
0% (0)    👎
细节还有待商榷,  主要思路就是用lag over 分别求出每个session start 和end的 event, 然后用sum over 把同一个session的start和end放一起, 然后group到一个event里面
不知道还有没有什么其他方法

select id,s_id,max(s_start_ts) as s_start_ts, max(s_end_ts) as s_end_ts from (
select id,ts,case when s_start=1 then ts end as s_start_ts,
case when s_end=1 then ts end as s_end_ts,sum(s_start) over (partition by id order by ts) as s_id from(
select id, ts, case when ts-ts1>30 then 1 else 0 end as s_start,
case when ts-ts1>30 then 1 else 0 end as s_end,
from (
select id,ts, lag(ts,1) over (partition by id order by ts) as ts1,lag(ts,-1) over (partition by id order by ts) as ts2 from t
)
)) group by 1,2 order by 1,2
回复

使用道具 举报

我的人缘0
14417335 2019-5-18 05:32:53 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (437)
 
 
0% (4)    👎
如果UserID为1的TS是1,40,41,42,43,....99,100算是几个sessions?

回复

使用道具 举报

我的人缘0
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (225)
 
 
7% (18)    👎
14417335 发表于 2019/05/18 05:32:53
如果UserID为1的TS是1,40,41,42,43,....99,100算是几个sessions?

超过30秒就算新的session
回复

使用道具 举报

我的人缘0
cimynfine 2019-5-18 06:22:44 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (165)
 
 
0% (0)    👎
不是应该30秒没有action 当前session就会终止 然后新的session开始吗? 还是说每一个有效session最多30秒 就算一直有action超过30秒也会terminate?感觉第一种好像更make sense
回复

使用道具 举报

我的人缘0
stephanieMC 2019-5-22 13:26:47 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   0% (0)
 
 
0% (0)    👎
请问这个是什么职位呢?
回复

使用道具 举报

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

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法 - 不要多加空格: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版||一亩三分地

GMT+8, 2019-9-22 01:08

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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