1

这是我在这里的第一个问题,所以如果我不遵循最佳实践,请告诉我!

我有两张桌子:

+---------+------------+--+
| Version | Time_Taken |  |
| 1       | 10         |  |
| 2       | 15         |  |
| 3       | 20         |  |
+---------+------------+--+

+--------+--------------+--+
| Bucket | Time_Allowed |  |
+--------+--------------+--+
|      1 |            5 |  |
|      2 |           10 |  |
|      3 |           10 |  |
|      4 |           10 |  |
|      5 |           10 |  |
+--------+--------------+--+

我希望能够查看我的版本是在哪个桶中完成的。版本必须按顺序完成,桶也必须按顺序完成。为了让它更有趣,只有当它们还有一些 time_allowed 时,桶才能被多个版本使用。

所以以版本 1 (time_taken = 10) 为例,我知道我将占用 Bucket 1 的所有 (time_allowed=5) 和 bucket 2 的一半,剩下 5 个。我现在在存储桶 2 中还剩 5 个,可以开始使用版本 2 填充该存储桶。

我现在正在使用 postgres,并且仍在学习其中的技巧,所以真的可以通过一些关于如何创建对这里有帮助的结构的一般性建议来做!

抱歉,如果这含糊不清!

4

1 回答 1

0

似乎您想计算累积总和,很容易使用标准 SQL 的Windowed Aggregate Functions。以下查询返回表 #2 中每个存储桶的覆盖时间范围:

select *, 
   sum(Time_Allowed) 
   over (order by Bucket
         rows unbounded preceding) - Time_Allowed AS timeFrom,
   sum(Time_Allowed) 
   over (order by Bucket
         rows unbounded preceding) AS timeTo
from tab2

您对Time_Taken表 #1 执行相同操作,然后您可以使用x between timeFrom and timeTo

于 2016-04-12T17:34:49.397 回答