对绘图的SQL存储数据进行二次采样

对绘图的SQL存储数据进行二次采样,sql,plot,graphing,level-of-detail,Sql,Plot,Graphing,Level Of Detail,假设您有一个每隔30秒将(时间戳、股价)记录到SQL数据库的程序,并且您希望生成不同时间尺度上的股价图。如果在1小时范围内绘制测量值,则可以使用在此期间采集的所有120个样本。然而,如果您想在1年的范围内绘制价格图,您显然不想从数据库中提取超过100万个样本。最好从数据库中提取一些具有代表性的样本子集 这让我想起了计算机图形学中的细节层次技术——当你远离3d模型时,可以使用保真度较低的模型 是否有常用的技术来表示数据库中的详细程度信息,或快速查询均匀分布的数据子集(例如,从2009年1月起给我1

假设您有一个每隔30秒将(时间戳、股价)记录到SQL数据库的程序,并且您希望生成不同时间尺度上的股价图。如果在1小时范围内绘制测量值,则可以使用在此期间采集的所有120个样本。然而,如果您想在1年的范围内绘制价格图,您显然不想从数据库中提取超过100万个样本。最好从数据库中提取一些具有代表性的样本子集

这让我想起了计算机图形学中的细节层次技术——当你远离3d模型时,可以使用保真度较低的模型

是否有常用的技术来表示数据库中的详细程度信息,或快速查询均匀分布的数据子集(例如,从2009年1月起给我100个均匀分布的样本)


到目前为止,我提出的解决方案是在数据库表中包含一个level_of_detail列。如果_detail的_级别=0,则该行保存单个瞬时采样。如果详细程度的级别=n,则该行包含最后(采样间隔*(2^n))秒数据的平均值,并且该级别的行数为1/(2^n)。该表有一个索引(level_of_detail,timestamp),当您想要生成绘图时,可以根据您想要的样本数计算适当的level_of_detail值,并使用该约束进行查询。缺点是:

  • 对于N个样本,表需要存储2*N行
  • 客户必须知道如何指定适当的详细级别约束
  • 当样本添加到表中时,一些流程需要负责构建平均行

对于SQL Server,您可以使用
ntile
。这将对数据集进行排序,然后将其拆分为N个不同的组,第一个组返回1,最后一个组返回N

select  MIN(MeasureTime) as PeriodStart
,       MAX(MeasureTime) as PeriodEnd
,       AVG(StockPrice) as AvgStockPrice
from    (
        select  MeasureTime
        ,       StockPrice
        ,       NTILE(100) over (order by MeasureTime) as the_tile
        from    @t YourTable
        ) tiled
group by
        the_tile
这将返回正好100行。如果您有兴趣尝试查询,请参阅以下测试数据的副本:

declare @t table (MeasureTime datetime, StockPrice int)
declare @dt date
set @dt = '2010-01-01'
while @dt < '2011-01-01'
    begin
    insert @t values (@dt, DATEDIFF(day,'2010-01-01',@dt))
    select @dt = DATEADD(day,1,@dt)
    end
declare@t表(MeasureTime datetime,StockPrice int)
声明日期@dt
设置@dt='2010-01-01'
而@dt<'2011-01-01'
开始
插入@t值(@dt,DATEDIFF(日期,'2010-01-01',@dt))
选择@dt=DATEADD(第1天,@dt)
结束

你看到财务图表显示高、低、收盘、开盘,难道没有理由吗。它向你展示了一天中的趋势(趋势就是你的朋友)和运动,这在一段时间内是很容易看到的。