首页 > 数据库 >sql ytd 附python 实现方式

sql ytd 附python 实现方式

时间:2023-03-01 11:46:32浏览次数:28  
标签:sku min python max sql date ytd id stock

ytd释义

YTD分析属于同比分析类,其特点在于对比汇总值,即从年初第一日值一直至今的值累加。作用在于分析企业中长期的经营绩效。

做法

假定:
有一张销量明细表

date 仓库 sku 销量
2020-01-01 杭州仓 03045 20

步骤1:
时间序列缺失值填充

/*
    生成一张包含每个stock_id, sku的完整时间表
*/
select stock_id, sku, 
explode(sequence(`min_date`,`max_date`,interval 1 day)) as `date` 
from 
(
/*
    计算stock_id, sku维度下的最大最小时间
*/
select stock_id, sku, 
min(date) as `min_date`, max(date) as `max_date` from input
group by stock_id, sku
)

步骤2:
以填充后的时间序列表作为左表,关联销售表,sales字段为空的填充为0

select stock_id, sku, date, COALESCE(sales, 0) ,year(date) as year from (
select stock_id, sku, 
explode(sequence(`min_date`,`max_date`,interval 1 day)) as `date` 
from 
(
select stock_id, sku, 
min(date) as `min_date`, max(date) as `max_date` from input
group by stock_id, sku
) as a 
left join input as b 
on a.stock_id = b.stock_id and a.sku = b.sku and a.date = b.date
)

步骤3:
开窗函数计算ytd

select *, 
sum(y) over (partition by (stock_id, sku,year) order by date)  from input

实践:

select  a.`date`, a.`stock_id`, a.`sku`, COALESCE(b.`y`, 0) as `y`,year(a.`date`) as `year`  from (
select `stock_id`,`sku`,
explode(sequence(`min_date`,`max_date`,interval 1 month)) as `date` 
from 
(
select `stock_id`,`sku`, 
min(`date`) as `min_date`, max(`date`) as `max_date` from input
group by `stock_id`,`sku`
))  as a 
left join input as b 
on a.`stock_id` = b.`stock_id` and a.`sku` = b.`sku` and a.`date` = b.`date`

select *, 
sum(`y`) over (partition by (`stock_id`, `sku`,`year`) order by `date`)  as `ytd_y`  from (
select  a.`date`, a.`stock_id`, a.`sku`, COALESCE(b.`y`, 0) as `y`,year(a.`date`) as `year`  from (
select `stock_id`,`sku`,
explode(sequence(`min_date`,`max_date`,interval 1 month)) as `date` 
from 
(
select `stock_id`,`sku`, 
min(`date`) as `min_date`, max(`date`) as `max_date` from input
group by `stock_id`,`sku`
))  as a 
left join input as b 
on a.`stock_id` = b.`stock_id` and a.`sku` = b.`sku` and a.`date` = b.`date`
)

python实现方法:

  1. 时间序列填充
  • explode
  • 做一个完整的时间序列
# 1. 固定开始时间和长度
dt = pd.DataFrame(pd.date_range('2020-01-01', periods=37, freq='M'))
dt.columns = ['date']

# 2. 根据数据集的最大最小时间作为范围
min_date = hist_month.date.min()
max_date = hist_month.date.max()

dt = pd.DataFrame(pd.date_range(start = min_date, end = max_date, freq='M'))
dt.columns = ['date']


2. 计算年

hist_month['year'] = hist_month['date'].dt.year
  1. cumsum函数
hist_month['YTDTotal'] = hist_month.groupby(['year','stock_id','sku'])['y'].cumsum()
hist_month.query('stock_id == "CK002" and  sku == "03045"')[['year','date','stock_id','sku','y','YTDTotal']]

标签:sku,min,python,max,sql,date,ytd,id,stock
From: https://www.cnblogs.com/tian1022/p/17167570.html

相关文章

  • Python批量读取HDF多波段栅格数据并绘制像元直方图
      本文介绍基于Python语言gdal模块,实现多波段HDF栅格图像文件的读取、处理与像元值可视化(直方图绘制)等操作。  另外,基于gdal等模块读取.tif格式栅格图层文件的方法可......
  • mysql中使用 when then 格式化查询结果
    mysql>select*fromuser;+----+------+------+|id|name|sex|+----+------+------+|1|张三|1||2|李四|1||3|张珊|0|+----......
  • Mysql获取时间戳的一些处理
    前情提要:老板需要一个统计今日新增用户的功能我的想法是统计24小时内新增用户的功能直接去问AI我明确指出了时间戳但是AI给出的答案却差了口气这就是老板给我工资......
  • Python-tomorrow应用于UI自动化的简单使用
    一、简介tomorrow属于第三方的一个模块,使用threads方法作为装饰器去修饰一个普通的函数,使其可以达到并发效果。使用起来非常简单。 二、安装pipinstalltomorrow......
  • SQL 多表关联更新语句
    A表WHERE条件来自B表查询结果集UPDATEaSETa.is_sync=0FROMA表aLEFTJOINB表bONa.order_id=b.order_idANDa.line_no=b.order_line_no......
  • 花10几元买ESP32-C3,体验一下MicroPython (和CircuitPython)
    ESP32是近年很火的国产低成本MCU系列。买了芯片ESP32-C3的模组安信可ESP-C3-32S的开发板安信可NodeMCUESP-C3-32S-Kit。开发板很小,没有任何多余的东西,还不如叫它「最......
  • pgsql中pg_dump显示:因为服务器版本不匹配而终止
    1、输入pg_dump命令后,显示“因为服务器版本不匹配而终止”。如图所示:  2、因为pgsql安装的版本为11.6,而pg_dump的版本成为了9.2,故无法备份。3、找到pg_dump的位置。......
  • python切换pip源
    PSE:\docker>pipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simpleWritingtoC:\Users\lenovo\AppData\Roaming\pip\pip.iniPSE:\docker>pip......
  • Python 中 response.json 和 json.loads 的区别
    很多时候在python中请求API我都是一会儿用response.json,一会儿用json.loads,但是这两个函数的区别我貌似一直没太搞明白,所以趁着这次就把他们解决掉。问题分析reson......
  • Database-SQL
                                                        ......