为了简单起见,我可以说我有一个像arr[time]=[price,asset]
一样的数组(价格可能会重复同一资产,最高可达每秒12次)。
我希望能够以不同的比例查看数据,例如5年,每1小时1个样本,2.5小时,每0.5小时1个样本,以及能够访问点之间的特定滴答。
在DynamoDB中使用多个表或在Redshift中使用单个数据库会更经济/方便吗?我使用哪些架构/表格进行Redshift?
编辑:我在{'time':1505128343,'price':3.141708,'asset':1}
等时间段内搜索时看起来像WHERE time>=1504118343 AND time<=1505128343
的实体我不一定要输出大范围的每一个价格(因此客户端不会崩溃)但是而是希望输出每个第n个价格。
在我的实现中,我会有不同比例的多个表,所以一旦范围足够大我们就会回退,所以如果我们有一系列表prices
,prices30s
,prices1h
,prices1day
等prices30s
表将每30秒采样一次。
答案 0 :(得分:1)
如果要严格访问每个第n条记录,可以使用窗口函数根据某种排序条件提供行号,但在性能方面可能非常糟糕。对于每60秒间隔的第一个价格,它会像这样工作:
WITH
sorted_entities as (
select
time
,price
,asset
,row_number() over (partition by asset,time/60 order by time)
from entities_table
)
select time, price, asset
from sorted_entities
where row_number=1
该查询将使用资产ID和Unix时间戳列的整数除法将表行分成小组,并根据精确时间给出每行1,2,3等,以便您可以进一步选择编号为1的行。你的表的排序键是asset,time
它会更快地工作,因为具有相同asset
的行在磁盘上彼此更接近。
如果抽样准确性不是优先考虑的话,你可以这么简单:
select * from entities_table where random()<0.0006944
其中0.0006944是1/24/60(一天被认为是100%概率,除以24小时和60分钟就得到一分钟的概率)。这将只是随机输出1/1440行并获取行数,随着时间的推移,您可能会获得半均匀分布的值集。
另一种方法是按照上面的建议计算平均值。