SQL面试题集:累计值与1000差值最小的记录

一、题目描述

司机累计收入首次接近目标值的订单定位,滴滴平台计划优化司机奖励策略的触发机制,需精准识别司机在接单过程中累计收入首次接近特定目标值1000元的订单节点。该分析用于动态调整奖励发放规则,提升司机接单积极性。

样例数据

假设表 t_sales 结构如下:

driver_idorder_idincomeorder_time
11012002025-02-19 09:00:00
11023002025-02-19 10:00:00
11035002025-02-19 11:00:00
21044002025-02-19 09:30:00
21056002025-02-19 10:30:00
二、SQL逻辑
  1. 计算每位司机的累计收入
select   driver_id
        ,order_id
        ,income
        ,order_time
        ,sum(income) over (partition by driver_id order by order_time) as cumulative_income
from    t_sales;

执行结果

driver_idorder_idincomeorder_timecumulative_income
11012002025-02-19 09:00:00200
11023002025-02-19 10:00:00500
11035002025-02-19 11:00:001000
21044002025-02-19 09:30:00400
21056002025-02-19 10:30:001000
  1. 计算累计收入与目标值的差值
 select   driver_id
         ,order_id
         ,income
         ,order_time
         ,cumulative_income
         ,abs(cumulative_income - 1000) as diff
from    (
            select   driver_id
                    ,order_id
                    ,income
                    ,order_time
                    ,sum(income) over (partition by driver_id order by order_time) as cumulative_income
            from    t_sales
        ) t;

执行结果

driver_idorder_idincomeorder_timecumulative_incomediff
11012002025-02-19 09:00:00200800
11023002025-02-19 10:00:00500500
11035002025-02-19 11:00:0010000
21044002025-02-19 09:30:00400600
21056002025-02-19 10:30:0010000
  1. 筛选差值最小的记录
   select   driver_id
        ,order_id
        ,income
        ,order_time
        ,cumulative_income
        ,diff
from    (
            select   driver_id
                    ,order_id
                    ,income
                    ,order_time
                    ,cumulative_income
                    ,diff
                    ,row_number() over (partition by driver_id order by diff) as rn
            from    (
                        select   driver_id
                                ,order_id
                                ,income
                                ,order_time
                                ,sum(income) over (partition by driver_id order by order_time)             as cumulative_income
                                ,abs(sum(income) over (partition by driver_id order by order_time) - 1000) as diff
                        from    t_sales
                    ) t1
        ) t2
where   rn = 1;

执行结果

driver_idorder_idincomeorder_timecumulative_incomediff
11035002025-02-19 11:00:0010000
21056002025-02-19 10:30:0010000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值