Mysql:尝试从包含许多成本的表中更新成本
我有一个包含库存、日期、数量和成本的库存交易汇总表tran。主键是库存和日期;日期字段是一个普通键。发行量为负,收益为正。每次收据上的成本值都会发生变化。查找股票编号或任何日期的当前成本非常简单且几乎是即时的:Mysql:尝试从包含许多成本的表中更新成本,mysql,Mysql,我有一个包含库存、日期、数量和成本的库存交易汇总表tran。主键是库存和日期;日期字段是一个普通键。发行量为负,收益为正。每次收据上的成本值都会发生变化。查找股票编号或任何日期的当前成本非常简单且几乎是即时的: select cost from tran where stock = 12345 AND date <= 20140518 order by date desc limit 1; 我的问题是尝试查看任何时间段的状态报告: create temp (stock
select cost from tran
where stock = 12345 AND date <= 20140518
order by date desc limit 1;
我的问题是尝试查看任何时间段的状态报告:
create temp
(stock int primary key,qty int,cost decimal(9,2));
insert into temp(stock,qty,cost)
select stock,sum(qty),cost from tran
where date <= 20140430
group by stock order by date desc;
库存状态数量正确,成本不正确。我尝试了许多方法以获得明显的成本,这是唯一有效的方法:
create temp2
(stock2 int primary key,cost2 decimal(9,3));
insert ignore into temp2
select stock,cost from tran
where date <= 20140430 order by date desc;
update temp inner join temp2
on stock = stock2 set cost = cost2;
插入忽略需要很长时间。有没有一种方法可以使用连接或子查询来实现这一点?实际生产表超过一百万条记录,上面的temp表是1900条记录,temp2表是14000条不同库存项目的实际数量
提前感谢您的帮助
问候
Ed Sharp您需要定义一段时间内的成本。首先想到的是avg: 或者,也许是加权平均数:
select stock, sum(qty), sum(cost * qty) / sum(qty)
from tran
where date <= 20140430
group by stock
order by date desc;
如果这些不起作用,请使用示例数据和您想要的结果更新您的问题。假设我正确理解您的问题,您正在尝试按日期获取库存、数量和最新成本?如果是这样,一个选项是使用相关子查询:
insert into temp(stock,qty,cost)
select t.stock,
sum(t.qty),
(select cost from tran t2 where t2.stock = t.stock and t2.date = max(t.date))
from tran t
where t.date <= 20140430
group by t.stock
order by t.date desc;
您还可以使用与原始查询类似的内容:
insert into temp(stock,qty,cost)
select t.stock,
sum(t.qty),
(select cost
from tran t2
where t2.stock = t.stock and
t2.date <= 20140430
order by t2.date desc
limit 1)
from tran t
where t.date <= 20140430
group by t.stock
order by t.date desc;
顺便说一下,您的第一次尝试没有正常工作,因为您没有按成本分组,mysql返回了一个任意值。大多数其他RDBMS要求select语句中的所有字段在组中由或在聚合中定义。您需要进一步解释您试图检索的不同成本。这是平均成本、上次输入的成本还是其他成本?谢谢您的快速回复。你的解决方案正是我想要的。有了980000条记录,临时表仅在2.6秒内创建。我曾想过一个sub_查询,但不知道如何做。再次感谢大家。
insert into temp(stock,qty,cost)
select t.stock,
sum(t.qty),
(select cost
from tran t2
where t2.stock = t.stock and
t2.date <= 20140430
order by t2.date desc
limit 1)
from tran t
where t.date <= 20140430
group by t.stock
order by t.date desc;