题解 | #某宝店铺连续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


传音控股公司福利 317人发布