所以我有一个看起来像这样的表:
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
我想找到产品为A且人有计数的数量计数> 1 在任何滑动30天范围内。另一个关键是,一旦两条记录符合标准,它们就不应再次添加到计数中。例如,对于1/1和1/20,人1的计数为3,但对于1/20和1/25,计数不会为3。人2将计数为2.人3将不会显示在结果中,因为第二个产品是B.此查询也将在特定日期范围内运行(例如,2014年1月1日 - 2014年10月27日)。
我的产品是用MySQL和PHP编写的,我更喜欢在MySQL中这样做,但这看起来更像是一个OLAP问题。我非常感谢任何指导。
答案 0 :(得分:0)
另一个关键是,一旦两条记录符合标准,它们就不应再次添加到计数中。
这不是关系型的。为了使其有意义,我们必须定义评估记录的顺序。虽然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;
对于后期处理,您需要查看product_counts
视图中的每一行,并查找与其对应的采购订单(your_table
行)。检查您之前是否已经看过这些订单(使用哈希集),如果是这样,请将它们排除在考虑范围之外,减少当前项目的数量并可能完全消除它。最好用SQL之外的过程语言来完成。