新手求助sql,数量随机分摊的问题

aladdinisme 2023-03-22 14:37:48

最近在学sql,碰上一个问题,就是我有张表spzl,里面有这个商品活动时间,每组可销售的最大值和最小值,活动要求的总数量,现在需要把这个总数量随机分配到活动时间内,该怎么写比较好呢?

例如:1.a商品活动时间为3月1日-3月7日共7天,活动要求的总数量是300,现需要把300的数量随机分到7天中

           2.然后再通过可销售的最大值4,最小值2计算出每天最多能销售几组,剩下不能整除的零头做一组

总数量300 时间3-13-7活动天数7
        
天数1234567
随机分摊数量36414845343660
最大销售组数1820+12422+1171830
最小销售组数910+11211+18+1915

 

...全文
785 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32606625 2023-03-22
  • 打赏
  • 举报
回复 1

CREATE TABLE spzl (
id INT PRIMARY KEY,
start_date DATE,
end_date DATE,
total_amount INT,
max_sellable INT,
min_sellable INT,
days INT,
random_amounts VARCHAR(50),
max_sellable_counts VARCHAR(50),
min_sellable_counts VARCHAR(50)
);
其中,各个字段的含义如下:

id:商品的唯一标识,可以使用自增的整数。
start_date:商品活动的开始日期,使用 DATE 类型存储。
end_date:商品活动的结束日期,使用 DATE 类型存储。
total_amount:商品活动的总数量。
max_sellable:每组商品可销售的最大数量。
min_sellable:每组商品可销售的最小数量。
days:商品活动的天数,可以通过计算 start_date 和 end_date 之间的天数得到。
random_amounts:将商品活动总数量随机分配到每天的数量,使用 VARCHAR 类型存储,例如 "36,41,48,45,34,36,60"。
max_sellable_counts:每天最多能销售的组数,使用 VARCHAR 类型存储,例如 "18,20+1,24,22+1,17,18,30"。
min_sellable_counts:每天最少能销售的组数,使用 VARCHAR 类型存储,例如 "9,10+1,12,11+1,8+1,9,15"。
-- 计算商品活动时间的天数
UPDATE spzl SET days = DATEDIFF(end_date, start_date) + 1;

-- 计算每天的随机分配数量
UPDATE spzl
SET daily_quantity = FLOOR(quantity / days),
remaining_quantity = quantity - FLOOR(quantity / days) * days;

-- 随机分配每天的数量
INSERT INTO spzl_random (id, date, quantity)
SELECT id,
DATE_ADD(start_date, INTERVAL seq DAY) AS date,
IF(seq < remaining_quantity, daily_quantity + 1, daily_quantity) AS quantity
FROM spzl
JOIN (SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7) AS seq
ON seq < days;

-- 计算每天最多和最少能销售的商品组数
SELECT date,
CEIL(quantity / max_sale) AS max_sale_num,
FLOOR(quantity / min_sale) AS min_sale_num
FROM (
SELECT date,
SUM(quantity) AS quantity,
MAX(max_sale_quantity) AS max_sale,
MIN(min_sale_quantity) AS min_sale
FROM (
SELECT date,
SUM(quantity) AS quantity,
MAX(daily_quantity) AS max_sale_quantity,
MIN(daily_quantity) AS min_sale_quantity
FROM spzl_random
GROUP BY date
) AS t1
JOIN spzl ON t1.id = spzl.id
GROUP BY date
) AS t2;
第一个 UPDATE 语句计算商品活动时间的天数,并将其存储在 spzl 表中的一个名为 days 的新列中。

第二个 UPDATE 语句根据总数量和天数计算出每天的随机分配数量,并将其存储在 spzl 表中的一个名为 daily_quantity 的新列中。同时,它还计算出剩余数量 remaining_quantity。

INSERT INTO 语句将每天的随机分配数量存储在一个名为 spzl_random 的新表中,其中使用了 IF 函数来处理剩余数量
condition 是一个逻辑表达式或值,如果为 TRUE,则返回 value_if_true,否则返回 value_if_false。
value_if_true 是当 condition 为 TRUE 时返回的值。
value_if_false 是当 condition 为 FALSE 时返回的值。
在上面的 SQL 语句中,condition 就是 seq < remaining_quantity,即当前日期的序号是否小于剩余数量;value_if_true 是 daily_quantity + 1,即如果当前日期的序号小于剩余数量,则返回 daily_quantity + 1;value_if_false 是 daily_quantity,即如果当前日期的序号大于等于剩余数量,则返回 daily_quantity。

aladdinisme 2023-03-22
  • 举报
回复
@qq_32606625 谢谢您的回复,还想请问一下,这个随机数是平均数?不是随机的?
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

5,888

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧