【问题标题】:Adjust column value based on difference between 2 dates根据两个日期之间的差异调整列值
【发布时间】:2023-01-12 04:40:31
【问题描述】:

我有一个季度每个月初的销售数据。

示例:对于 22-Q1 季度,我在 3 个日期(1 月 1 日、2 月 1 日和 3 月 1 日)进行销售

Date Country Region Sales
01/01/2022 UK EMEA 100,000
02/01/2022 UK EMEA 170,000
03/01/2022 UK EMEA 120,000
01/01/2022 US AMS 90,000
02/01/2022 US AMS 110,000
03/01/2022 US AMS 160,000

我的要求是根据 2 个给定日期之间的差异推断 2 个给定日期之间的销售数据,并将它们连接到同一个表中。

例如,对于 1 月 2 日,我计算 1 月 1 日和 2 月 1 日之间的日期差异,即 31 天,并将销售额增加 (1/31),对于 1 月 3 日,我将销售额增加 (2/31).. 所以一直持续到 1 月 31 日。

月份更改后,需要重新计算 2 月 1 日和 3 月 1 日之间的日期差异,并且需要应用类似的销售额增量

【问题讨论】:

  • 我已经在此处删除了垃圾邮件标签;请只标记你的 RDBMS真的使用。标记多种相互冲突的技术会使您的问题不清楚,因此更难回答。也不太可能让您的问题“获得更多浏览量”,并且可能会产生相反的效果,只有知道的用户全部您标记(错误)标记的 RDBMS 将受理该问题;这通常只占用户群的一小部分。标签垃圾邮件更有可能导致您的问题收到反对票和/或因不清楚而被关闭。请edit您的问题以重新标记正确的 RDBMS。

标签: sql snowflake-cloud-data-platform


【解决方案1】:

您可以使用 UDTF 生成每月每一天的行以及销售额的外推。

create or replace table T1 as 
select 
COLUMN1::date   as Date,
COLUMN2::string as Country,
COLUMN3::string as Region,
COLUMN4::number(38,2) as Sales
from (values
('01/01/2022','UK','EMEA',100000),
('02/01/2022','UK','EMEA',170000),
('03/01/2022','UK','EMEA',120000),
('01/01/2022','US','AMS',90000),
('02/01/2022','US','AMS',110000),
('03/01/2022','US','AMS',160000)
);

create or replace function EXTRAPOLATE_MONTH_TO_DAYS(MONTH_START date, VAL float)
returns table (DAY_DATE date, VAL float)
language javascript
as
$$
{
    initialize: function (argumentInfo, context) {
    },
    processRow: function (row, rowWriter, context) {
        const DAY = 86400000; // Milliseconds per day.
        let firstDay = row.MONTH_START;
        let lastDay = new Date(row.MONTH_START.getFullYear(), row.MONTH_START.getMonth() + 1, 0);
        let daysInMonth = lastDay.getDate();
        let valPerDay = row.VAL / daysInMonth;
        let sum = 0;
        let curDate = row.MONTH_START;
        for (let i = 1; i <= daysInMonth; i++) {
            sum += valPerDay;
            rowWriter.writeRow({DAY_DATE:new Date(firstDay.getTime()+DAY*(i-1)),VAL:sum});
        }
    },
}
$$;


select   DATE
        ,COUNTRY
        ,REGION
        ,SALES
        ,DAY_DATE
        ,round(VAL,2)::number(38,2) EXTRAPOLATED_RUNNING_TOTAL
from T1, table(EXTRAPOLATE_MONTH_TO_DAYS(DATE, SALES::float) over (partition by COUNTRY, REGION order by DATE))
;

前五行:

DATE COUNTRY REGION SALES DAY_DATE EXTRAPOLATED_RUNNING_TOTAL
2022-01-01 US AMS 90000 2022-01-01 2903.23
2022-01-01 US AMS 90000 2022-01-02 5806.45
2022-01-01 US AMS 90000 2022-01-03 8709.68
2022-01-01 US AMS 90000 2022-01-04 11612.90
2022-01-01 US AMS 90000 2022-01-05 14516.13

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2011-10-29
    • 2021-10-21
    • 1970-01-01
    • 2014-02-12
    • 2015-09-14
    • 2015-06-21
    • 2020-02-06
    • 2023-04-08
    相关资源
    最近更新 更多