当前位置: 首页 > 面试题库 >

根据每日收益分成将固定值分配给各个国家/地区时,排除某些值

汪庆
2023-03-14
问题内容

DB提琴

CREATE TABLE sales (
    id int auto_increment primary key,
    country VARCHAR(255),
    sales_date DATE,
    sales_volume INT,
    fix_costs INT
);

INSERT INTO sales
(country, sales_date, sales_volume, fix_costs
)
VALUES

("DE", "2020-01-03", "500", "0"),
("NL", "2020-01-03", "320", "0"),
("FR", "2020-01-03", "350", "0"),
("None", "2020-01-30", "0", "2000"),

("DE", "2020-02-15", "700", "0"),
("NL", "2020-02-15", "420", "0"),
("FR", "2020-02-15", "180", "0"),
("None", "2020-02-29", "0", "5000"),

("DE", "2020-03-27", "180", "0"),
("NL", "2020-03-27", "670", "0"),
("FR", "2020-03-27", "970", "0"),
("None", "2020-03-31", "0", "4000");

预期结果:

sales_date      country       sales_volume     fix_costs
2020-01-03        DE              500           37.95  (=2000/31 = 64.5 * 0.59)
2020-01-03        FR              350           26.57  (=2000/31 = 64.5 * 0.41)
2020-01-03        NL              320            0.00
2020-02-15        DE              700          137.15  (=5000/29 = 172.4 * 0.8)   
2020-02-15        FR              180           35.27  (=5000/29 = 172.4 * 0.2)  
2020-02-15        NL              420            0.00    
2020-03-27        DE              180           20.20  (=4000/31 = 129.0 * 0.16) 
2020-03-27        FR              970          108.81  (=4000/31 = 129.0 * 0.84)   
2020-03-27        NL              670            0.00

参照解决这个问题,我目前使用下面的查询来划分monthly fix_costs 一个上
每天各个国家

select 
    sales_date, 
    country, 
    sum(sales_volume),
    sum(sum(fix_costs)) over(partition by year(sales_date), month(sales_date))
        / day(last_day(sales_date)) 
        * sum(sales_volume)
        / sum(sum(sales_volume)) over(partition by sales_date)
        as fix_cost_per_day
from sales
group by 1,2;

所有这些都很好。

但是,现在我希望该国家/地区NL被排除在外,share_calculation并且始终0如您在预期结果中所看到的那样保持现状。我必须如何修改查询才能实现此目的?


问题答案:

您可以在计算 周围 和窗口 使用case表达式: sum

select 
    sales_date, 
    country, 
    sum(sales_volume),
    case when country <> 'NL'
        then sum(sum(fix_costs)) over(partition by year(sales_date), month(sales_date))
            / day(last_day(sales_date)) 
            * sum(sales_volume)
            / sum(case when country <> 'NL' then sum(sales_volume) else 0 end) over(partition by sales_date)
    else 0
    end as fix_cost_per_day
from sales
group by 1,2;

DB
Fiddle上的演示


销售日期| 国家| 总和(sales_volume)| fix_cost_per_day
:--------- | :------ | ----------------:| ---------------:
2020-01-03 | DE | 500 | 37.95066414
2020-01-03 | FR | 350 | 26.56546490
2020-01-03 | NL | 320 |             _空_
2020年1月30日| 无| 0 |             _空值_
2020-02-15 | DE | 700 | 137.14733542
2020-02-15 | FR | 180 | 35.26645768
2020-02-15 | NL | 420 |             _null_ 
2020-02-29 | 无| 0 |             _空值_
2020-03-27 | DE | 180 | 20.19635344
2020-03-27 | FR | 970 | 108.83590463
2020-03-27 | NL | 670 |             _null_ 
2020-03-31 | 无| 0 |             _空值_


 类似资料:
  • 本文向大家介绍区分每股收益(EPS)和稀释每股收益(D-EPS)。,包括了区分每股收益(EPS)和稀释每股收益(D-EPS)。的使用技巧和注意事项,需要的朋友参考一下 每股收益(EPS)和稀释每股收益(D-EPS)之间的主要区别如下- 每股收益(EPS) 每股稀释收益(D-EPS) 计算公司的基本每股收益。 计算公司的每股可转换股收益。 主要目的是计算公司的盈利能力。 主要目的是计算包括可转换证券

  • 在Apache Spark中, -允许将RDD精确划分为分区。 而是如何将给定的RDD划分成分区,使得所有分区(最后一个分区除外)都具有指定数量的元素。鉴于RDD元素的数量是未知的,做<代码>。count()的开销很大。 预期:

  • 最早和最简单的技术之一是用于将多个进程加载到主内存中的是固定分区或连续内存分配。 在这种技术中,主存储器被分成相等或不同大小的分区。 操作系统始终驻留在第一个分区中,而其他分区可用于存储用户进程。 内存以连续的方式分配给进程。 在固定分区中, 分区不能重叠。 进程必须在分区中连续存在才能执行。 有使用这种技术的各种缺点。 1. 内部碎片 如果进程的大小较小,那么分区的总大小会导致分区的某些大小被浪

  • 我正在使用Cloudera VM,一个linux终端和火花版本1.6.0 假设我有以下数据集: 优先级、数量、销售额= 最低价,6,261.54 高,44,1012 低,1,240 高,252500 我可以加载," val input file = sc . textfile(" file:///home/cloud era/stat . txt ") 我可以排序,"inputFile.sort(

  • 问题内容: 我正在尝试创建一个(sqlite)查询,该查询将执行GROUP BY,但不会将任何值’unknown’分组。例如,我有表: 使用正确的查询并带有“ GROUP BY名称,parent_id,school_id”,我需要返回以下行: 任何帮助将不胜感激。谢谢! 问题答案: 您很难用一个语句来完成此操作,但是可以使用两个语句的结果 所有的名单 ,但 添加()全部列表 SQL语句 请注意,我

  • 问题内容: 这是我对源数据的插入语句。 我有我的源数据 该数据已经排序,和。 我正在尝试从中生成此输出: 这是从原始数据得出结果的逻辑: 对于带有,或的每个记录 A* :如果以下记录 B 具有,则: * 如果记录 乙 具有相同的日期部分如 甲 (忽略时间),同时消除记录 甲 和 乙 从结果。这就是为什么删除记录4、5、8和9的原因; 否则,如果记录 B 的值早于记录 A ,则将 A 的值更新为 B