首页 > 解决方案 > 计算前期间的总数,不包括回顾之前和参考年之后的计数

问题描述

假设一个学生每天只吃 1 颗糖果。我需要找出一个学生在开学前消耗了多少糖果(如红色字体“Total_candies_consumed_one_year_before_start_of_school”一栏所示)。我的数据如表中黑色字体所示。我计算了突出显示的列。我提供了有关如何计算“Total_candies_consumed_one_year_before_start_of_school”的基本原理。 在此处输入图像描述

我被困在如何排除“1_year_lookback_period”之前和“开学日期”之后发生的计数。

任何帮助是极大的赞赏。

标签: sqldateselectnetezza

解决方案


我认为您正在寻找某种线性回归。

school_start_date这个想法是通过计算此期间与糖果定义的日期范围之间的重叠天数purchase_date 来评估在之前的一年中消耗了多少consumed_date糖果。根据重叠率,您可以预测回溯期间的消耗。

这应该做你想要的:

select
    t.*,
    number_of_candies *
        greatest(
            least(school_start_date, consumed_date) 
            - greatest(purchase_date, add_months(school_start_date, -12)), 
            0
        ) / (consumed_date - purchase_date) candies_consumed_during_loopback
from mytable t

DB Fiddle 上的演示

身份证 | 购买日期 | NUMBER_OF_CANDIES | 消费日期 | 学校_START_DATE | RES
-: | :------------ | ----------------: | :------------ | :---------------- | --:
 1 | 2009 年 12 月 30 日 | 15 | 10 年 1 月 14 日 | 2011 年 1 月 1 日 | 13
 1 | 2010 年 5 月 30 日 | 30 | 29-JUN-10 | 2011 年 1 月 1 日 | 30
 2 | 10 年 11 月 1 日 | 90 | 2011 年 1 月 30 日 | 2011 年 1 月 1 日 | 61
 2 | 2012 年 8 月 9 日 | 15 | 12 年 8 月 24 日 | 2011 年 1 月 1 日 | 0
 3 | 14 年 12 月 1 日 | 900 | 17 年 5 月 19 日 | 2016 年 1 月 1 日 | 365

推荐阅读