题解 | #牛客每个人最近的登录日期(三)#

牛客每个人最近的登录日期(三)

http://www.nowcoder.com/practice/16d41af206cd4066a06a3a0aa585ad3d

依然详细版(个人理解,比较繁琐)
①先找到每个客户的首次登录时间
SELECT L.user_id,MIN(L.date)
FROM login L
GROUP BY L.user_id
② 利用函数找到对应客户客户的下次登陆时间
SELECT CCDLB.*,DATE_ADD(CCDLB.CCDLSJ,INTERVAL 1 DAY) AS XCDLSJ
FROM (SELECT L.user_id,MIN(L.date) AS CCDLSJ
FROM login L
GROUP BY L.user_id) AS CCDLB;
③连接login表找到对应的上的客户
SELECT QBXXB.*,L1.date
FROM (SELECT CCDLB.*,DATE_ADD(CCDLB.CCDLSJ,INTERVAL 1 DAY) AS XCDLSJ
FROM (SELECT L.user_id,MIN(L.date) AS CCDLSJ
FROM login L
GROUP BY L.user_id) AS CCDLB) AS QBXXB
LEFT JOIN login L1
ON QBXXB.user_id=L1.user_id AND QBXXB.XCDLSJ=L1.date
④分别计数
SELECT COUNT(*) AS QBKH,COUNT(IF(QBB.date IS null,null,1)) AS LCKH
FROM (SELECT QBXXB.*,L1.date
FROM (SELECT CCDLB.*,DATE_ADD(CCDLB.CCDLSJ,INTERVAL 1 DAY) AS XCDLSJ
FROM (SELECT L.user_id,MIN(L.date) AS CCDLSJ
FROM login L
GROUP BY L.user_id) AS CCDLB) AS QBXXB
LEFT JOIN login L1
ON QBXXB.user_id=L1.user_id AND QBXXB.XCDLSJ=L1.date) AS QBB
⑤计算概率
SELECT FORMAT(ROUND(B.LCKH/B.QBKH,4),3) AS P
FROM (SELECT COUNT(*) AS QBKH,COUNT(IF(QBB.date IS null,null,1)) AS LCKH
FROM (SELECT QBXXB.*,L1.date
FROM (SELECT CCDLB.*,DATE_ADD(CCDLB.CCDLSJ,INTERVAL 1 DAY) AS XCDLSJ
FROM (SELECT L.user_id,MIN(L.date) AS CCDLSJ
FROM login L
GROUP BY L.user_id) AS CCDLB) AS QBXXB
LEFT JOIN login L1
ON QBXXB.user_id=L1.user_id AND QBXXB.XCDLSJ=L1.date) AS QBB) B
看起来很复杂,其实后一步都是用的前一步的查询结果,望有助!




全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务