朋友在拼多多面试中遇到了一个关于数据库的问题,涉及连续支付失败次数的统计。具体问题是需要从支付流水表中统计每个用户最大的连续支付失败次数。
支付流水表pay的字段包括id, uid, time, status。需要根据这些字段统计出输出字段为uid和cnt(失败次数),通过uid来统计每个用户的最大连续支付失败次数。
解决思路
解决这类连续问题可以采用创建一个连续列与目标列相比较的方法。针对该问题,首先需要按时间排序,然后判定连续失败次数。
推荐的解决步骤是:
1. 根据用户编号开窗,按时间排序,并增加行号,从而得到每个用户按时间排序的订单序号。
2. 筛选掉支付订单成功的,再次按用户编号开窗,按时间排序,并增加行号,得到每个用户按时间排序的失败订单的序号。
3. 两个序号相减,相等的数字表示连续。
4. 根据用户和得到的数字分组,或者最大的组,就是最大的连续支付失败的订单数量。
WITH ContinueCustomer AS(
SELECT p1.*, p1.rowNumber - RANK() over(PARTITION by p1.uid ORDER BY p1.time) as diff FROM (
SELECT *,RANK() over(PARTITION by uid ORDER BY time) as rowNumber FROM pay
) p1 WHERE p1.status = 'fail'
),
EveryContinueCustomerCounts AS(
SELECT uid,count(1) as times FROM ContinueCustomer GROUP BY uid,diff
)
SELECT uid,max(times) as cnt FROM EveryContinueCustomerCounts GROUP BY uid
总结
解决问题的方法可能各有不同,但希望这个思路对大家能有所启发。祝大家面试顺利。