我有一张桌子,看起来像这样:
id | slot | total |
---|---|---|
1 | 2022-12-01T12:00 | 100 |
2 | 2022-12-01T12:30 | 150 |
3 | 2022-12-01T13:00 | 200 |
槽上已经有索引了.该表有大约100mil行(以及这里没有显示的更多列)
我想把总数加起来,算到(EDIT: WASN'T CLEAR INITIALLY, I WILL PROVIDE A LOWER SLOT BOUND, SO THE SUM WILL BE OVER SOME NUMBER OF DAYS/WEEKS, NOT OVER FULL TABLE)的当前时刻.假设现在的时间是2022-12-01T12:45
.如果我跑select * from my_table where slot < CURRENT_TIMESTAMP()
,
然后我拿回了1
和2
的记录.
然而,在我的数据中,这些记录代表了一个时间段内的预测销售额.我想要找到截至2022-12-01T12:45
的预测,因此我想要找到记录2
的半小时时段已经过go 的比例,并返回总数的该比例.
截至2022-12-01T12:45
(假设为分钟粒度),第2
行中的50%
行已经过go ,因此我预计总数将返回150 / 2 = 75
.
我当前的查询可以工作,但速度很慢.我有什么方法可以优化这一点,或者我可以采取其他方法?
另外,我们如何将这一解决方案推广到任意区间频率?也许明天我们会改变我们的预测模型,数据会零星地出现.在这种情况下,硬编码的30
将不起作用.
select sum(fraction * total) as t from
select total,
LEAST(
timestampdiff(
minute,
datetime,
current_timestamp()
),
30
) / 30 as fraction
from my_table
where slot <= current_timestamp()