Php 每30天范围内的列计数
我有一张桌子,看起来像这样:Php 每30天范围内的列计数,php,mysql,sql,Php,Mysql,Sql,我有一张桌子,看起来像这样: Person Product Date Quantity 1 A 1/11/2014 1 2 A 1/11/2014 2 1 A 1/20/2014 2 3 A 1/21/2014 1 3 B 1/21/2014
Person Product Date Quantity
1 A 1/11/2014 1
2 A 1/11/2014 2
1 A 1/20/2014 2
3 A 1/21/2014 1
3 B 1/21/2014 1
1 A 1/25/2014 1
我想在任何滑动30天范围内,找到产品数量和个人数量>1的数量。另一个关键是,一旦两个记录满足条件,它们就不应该再次添加到计数中。例如,对于1/11和1/20,人员1的计数将为3,但是对于1/20和1/25,人员1的计数将不为3。第二个人将有一个2的计数。第三个人不会出现在结果中,因为第二个产品是B。此查询也将在特定的日期范围内运行(例如,2014年1月1日-2014年10月27日)
我的产品是用MySQL和PHP编写的,我更愿意只在MySQL中编写,但这更像是OLAP问题。我非常感谢您的指导
另一个关键是,一旦两个记录满足条件,它们就不应该再次添加到计数中
这不是关系。为了使其有意义,我们必须定义对记录求值的顺序。虽然SQL确实有ORDER BY,但这仅用于显示目的。它不影响查询的计算顺序。评价的顺序并不重要
我认为这根本不能用SELECT
查询来表达。如果我是对的,那就剩下plSQL或非SQL语言了
如果您愿意放弃这个需求(或者在后处理中实现它,请参见下文),那么这是可行的。从所有相关日期范围的视图开始:
CREATE VIEW date_ranges(
start_date, -- DATE
end_date -- DATE
) AS
SELECT DISTINCT date, DATE_ADD(date, INTERVAL 30 day)
FROM your_table;
现在,创建相关计数的视图:
CREATE VIEW product_counts(
person, -- INTEGER REFERENCES your_table(person)
count, -- INTEGER
start_date, -- DATE
end_date -- DATE
) AS
SELECT y.person,
sum(y.quantity),
r.start_date,
r.end_date
FROM date_ranges r
JOIN your_table y
ON y.date BETWEEN r.start_date AND r.end_date
GROUP BY y.person
HAVING sum(y.quantity) > 1;
对于后期处理,您需要查看
产品\u计数
视图中的每一行,并查找与之对应的采购订单(您的\u表的行)。检查您以前是否见过这些订单(使用散列集),如果见过,请将其排除在考虑范围之外,减少当前项目的数量,并可能将其完全删除。这最好用SQL以外的过程语言来完成。您能分享一下您的尝试吗?我甚至不知道从哪里开始专门在MySQL中完成这项工作。我可以在这个范围内每隔30天用php做一次嵌套循环,并建立一个集合。不过,这太残忍了。您始终可以创建一个存储过程。日期范围为2014年1月1日至2014年10月21日的预期输出是什么?日期范围为2014年11月1日至2014年1月21日的预期输出是什么?我想更好地理解这个请求。对于1/1-10/21,它将返回1:4,2:2。对于1/11-1/21,它将返回相同的结果,因为我们将看到1/11+30天到1/21+30天。1/25不在开始日期范围内这一事实无关紧要,因为它在d+30.0范围内。我希望有一个关系解决方案,但我相信你是对的。