暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL进阶技巧:三分计价问题 | 如何将1块钱均分给3个人,且总和为1块?

会飞的一十六 2024-11-26
143

点击上方【蓝色】字体   关注我们



01 场景描述

一块钱平均分3份,总数加起来等于1块?如何用一条SQL实现了?最终结果如下


02 数据准备


    create table all_money as
    select 1 as all_money, 1 as num
    union all
    select 1 as all_money, 2 as num
    union all
    select 1 as all_money, 3 as num



    03 问题分析

    步骤1:计算平均金额

      select all_money
      , num
      , cast(1 COUNT(*) over () as decimal(18, 4)) avg_money
      , row_number() over (order by num desc) rn
      from all_money



      第二步:计算累计平均金额


        select all_money
        , num
        , avg_money
        , rn
        , sum(avg_money) over (order by rn desc) acc_avg_money
        from (select all_money
        , num
        , cast(1 COUNT(*) over () as decimal(18, 4)) avg_money
        , row_number() over (order by num desc) rn
        from all_money) t



        第三步:计算分摊金额

          select num
          ,case when rn != 1 then avg_money else (1 - acc_avg_money) + avg_money end money
          from
          (select all_money
          , num
          , avg_money
          , rn
          , sum(avg_money) over (order by rn desc) acc_avg_money
          from (select all_money
          , num
          , cast(1 COUNT(*) over () as decimal(18, 4)) avg_money
          , row_number() over (order by num desc) rn
          from all_money) t) t


          04  小 结      


          文章利用SQL语言给出了一种均分后的分摊算法,具体应用场景如下:

             已知车辆编号,总运费,货主姓名,货主货物金额,现在需要货主按照货物金额的占比去分担运费,要求所有货主分担的运费和等于总运费。
            该场景具体实现读者自行完成。



            会飞的一十六


            扫描右侧二维码关注我们






            点个【在看】 你最好看






            往期精彩

            SQL进阶技巧:当表查询结果为空时,如何输出NULL值?

            数据科学与SQL:如何计算Teager能量算子(TEO)?| 基于SQL实现

            SQL进阶技巧:如何求组内排除当前行的移动平均值

            文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论