我正在尝试查询下表,以根据每个项目有30天的库存时间为我提供开始日期和结束日期。(库存不是连续的)
例如,如果我在过去40天中有30天的商品有库存,那么我会有第一个日期,商品有库存,最后一天商品有库存,当我们达到30天时。结束日期应尽可能接近今天。我知道我可以在php代码中做到这一点,但是表会变得很大,并且很难存储在内存中。
这在sql中是可能的吗?
CREATE TABLE phppos_inventory_stock_log (
id int(10) NOT NULL AUTO_INCREMENT,
in_stock int(1) NOT NULL DEFAULT '0',
date date NOT NULL,
item_id int(10) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY in_stock (item_id,in_stock,date)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
mysql> select * FROM phppos_inventory_stock_log;
+----+----------+------------+---------+
| id | in_stock | date | item_id |
+----+----------+------------+---------+
| 1 | 1 | 2018-03-10 | 2 |
| 2 | 1 | 2018-03-11 | 2 |
| 3 | 1 | 2018-03-12 | 2 |
| 4 | 1 | 2018-03-13 | 2 |
| 5 | 1 | 2018-03-10 | 1 |
| 6 | 0 | 2018-03-11 | 1 |
| 7 | 1 | 2018-03-12 | 1 |
| 8 | 1 | 2018-03-13 | 1 |
在上述具有3天库存的示例中,项目id 2将是开始日期2018-03-11到2018-03-13,并且项目id 1将是2018-03-10到2018-03-13
发布于 2018-03-16 05:09:05
如果我没理解错的话,你需要一个日期,当商品有30倍的库存时。
首先,我们需要找到最新的日期,当商品在库存max(date)
中时,然后我们选择每个日期,当我们在库存时,按天数排序,我们限制到我们感兴趣的范围(30天),并选择最旧的日期。
SELECT max(`date`) AS max_date, item_id,
(SELECT MIN(`date`)
FROM phppos_inventory_stock_log AS chsl
WHERE chsl.item_id = psl.item_id
AND in_stock = 1
ORDER BY `date` DESC
LIMIT 30) AS min_date
FROM phppos_inventory_stock_log AS psl
WHERE in_stock = 1
GROUP BY item_id
注意:如果你有大量的数据,你会杀死数据库。限制返回结果的数量或检索特定item_id
的列表。
https://stackoverflow.com/questions/49306392
复制相似问题