Как я могу распределить значения в сегменты и найти, какой блок содержит значение?
Это мой первый вопрос, поэтому, пожалуйста, дайте мне знать, если я не буду следовать лучшим практикам!
У меня есть две таблицы:
+---------+------------+--+
| 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