每30天范围内的列数

时间:2014-10-28 17:22:59

标签: 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        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问题。我非常感谢任何指导。

1 个答案:

答案 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之外的过程语言来完成。

相关问题