【发布时间】:2014-03-12 02:29:25
【问题描述】:
我在弄清楚如何以各种方式对表进行分组时遇到了一些问题,对已售出的单位数量进行求和,但仅对每个组中每个项目的最新现有单位进行求和。
这是一个示例数据集:http://www.sqlfiddle.com/#!2/3ff18/1
我需要能够以这样一种方式执行 GROUP BY,即 On Hand 列仅针对每个组中最近的项目求和。
我在使用 MAX(date) 的“自我加入”方面取得了一些进展,但在使用各种 GROUP BY 时我没有得到想要的结果。
在给定 sqlfiddle.com 数据集的情况下,我希望看到一些示例输出:
Category Sold On Hand
Electronics 500 0
Books 500 0
Other 0 100
Quarter Category Sold On Hand
Q1 Electronics 400 100
Q1 Books 400 100
Q1 Other 0 100
Q2 Electronics 100 0
Q2 Books 100 0
Q2 Other 0 100
Month Sold On Hand
January 300 800
February 100 700
March 200 500
April 200 300
May 0 300 <- This May entry isn't strickly necessary, but it would be nice
June 100 200
July 100 100 <- This 100 units On Hand is from Item 987 that hasn't been sold
MAX(date) 方法让我感到困惑的一个领域是GROUP BY month。如果您查看上面的表格,您会注意到我希望在 7 月份看到 100 件在手……也就是说,除了 1 月份添加的第 987 件之外,所有单元都已售出,但有没卖。
几点说明:
- 这是使用 MySQL,但如果 PostgreSQL 具有支持此功能的窗口函数,它会愿意尝试。
- 鉴于目前有 150 万条记录,该解决方案的性能非常重要。并且可能会增加数百万。
【问题讨论】:
标签: mysql sql postgresql date-arithmetic window-functions