题解 | #某宝店铺连续2天及以上购物的用户及其对应的天数#

某宝店铺连续2天及以上购物的用户及其对应的天数

https://www.nowcoder.com/practice/63ac3be0e4b44cce8dd2619d2236c3bf

#这里我用了两种解法,思路一致,但在对rank编号后有两种解法。

#一种是将日期减去排名得到连续的天数sales_date-rank() over(partition by user_id order by sales_date) days。

#一种是用date_sub将日期往前推rank天,结果一致的为连续登录,但是这一种需要写多一个子查询,所以还是用第一种了。

#原理,按用户分类对日期做一个排名连续且唯一的辅助列,再用日期减去排名,如果结果一致,那么登录天数就是连续的。比如4号5号,7号登录,rank为1,2,3,那4-1,5-2都是3。7-3=4,结果一致的前两行是连续登录的。再count一下就能算出每个用户连续登录的天数。

#解法1

SELECT user_id, COUNT(days) AS days_count

FROM (

    SELECT DISTINCT sales_date,

        user_id, #取唯一日期值,避免多个同一天的日期跟排名相减,影响差值的计数结果

        sales_date - row_number() OVER (PARTITION BY user_id ORDER BY sales_date) AS days #这里用rank也一样,因为日期已经取了唯一值

    FROM sales_tb

) a

GROUP BY user_id, days

HAVING days_count >= 2

#解法2

SELECT user_id, COUNT(days) AS days_count

FROM (

    SELECT user_id, date_sub(sales_date, INTERVAL rk DAY) AS days

    FROM (

        SELECT DISTINCT sales_date,

            user_id,

            row_number() OVER (PARTITION BY user_id ORDER BY sales_date) AS rk

        FROM sales_tb

    ) a

) b

GROUP BY user_id, days

HAVING days_count >= 2

全部评论

相关推荐

10-31 13:04
南华大学 Java
嵌入式的小白:很多面试,面试前不会去打扰cto的,但一般cto不会在这些小事上刷人,只能说这个cto比较操心,啥重要不重要,紧急不紧急的,估计都会过问,平淡看待吧
点赞 评论 收藏
分享
刷牛客的我很豁达:你是不是对算法有什么误解,你没手握两篇顶刊顶会,还想搞算法岗,有顶刊顶会在算法岗算才入门
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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