Как я могу распределить значения в сегменты и найти, какой блок содержит значение?

Это мой первый вопрос, поэтому, пожалуйста, дайте мне знать, если я не буду следовать лучшим практикам!

У меня есть две таблицы:

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

а также

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

Я хотел бы видеть, в каком из Buckets была завершена моя версия. Версии должны быть завершены по порядку, как и Buckets. Чтобы сделать его более увлекательным, корзины могут использоваться несколькими версиями, только если у них осталось некоторое время.

Так, например, для версии 1 (time_taken = 10) я знаю, что возьму все ведро 1 (time_allowed=5) и половину ведра 2 с 5 оставшимися. Теперь у меня осталось 5 в корзине 2, и я могу начать заполнять эту корзину версией 2.

Я использую postgres прямо сейчас и все еще изучаю веревки, поэтому мог бы действительно дать несколько общих советов о том, как создать структуру, которая поможет здесь!

Извиняюсь, если это расплывчато!

1 ответ

Похоже, вы хотите рассчитать кумулятивные суммы, легко используя оконные агрегированные функции стандартного SQL. Следующий запрос возвращает пройденный временной интервал для каждого сегмента в таблице № 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

Другие вопросы по тегам