2011-01-20 30 views
1

SQLデータベースに(timestamp、stock_price)を30秒ごとに記録し、さまざまなタイムスケールにわたって株価のプロットを生成するプログラムがあるとします。 1時間の範囲で測定値をプロットする場合は、その時間に撮影した120個のサンプルをすべて使用することができます。しかし、価格を1年間の範囲でプロットしたい場合、明らかに100万個のサンプルをデータベースから取り出すことは望ましくありません。サンプルのいくつかの代表的なサブセットをデータベースから取り出す方が良いでしょう。サブサンプリングSQLプロットのデータ格納

これはコンピュータグラフィックスの詳細レベルの手法を思い出させます.3Dモデルから遠くに移動するにつれて、モデルの低忠実度バージョンを使用することができます。

データベース内の詳細度情報を表す、または均等に配置されたデータのサブセットをすばやく照会する一般的な手法はありますか(たとえば、2009年1月から100個のサンプルを均等に割り当てます)。


私がこれまでに作ってみたソリューションは、データベーステーブルのlevel_of_detail列を含めることです。 level_of_detail = 0の場合、行には1つの瞬時サンプルが格納されます。 level_of_detail = nの場合、行にはデータの最後の(sample_interval *(2^n))秒の平均が含まれ、このレベルには1 /(2^n)行があります。表には(level_of_detail、timestamp)の索引があり、プロットを生成する場合は、必要なサンプル数に基づいて適切なlevel_of_detail値を計算し、その制約を使用して照会します。短所は次のとおりです。N個のサンプルについては

  • 、テーブルは2を保存するために必要* N行
  • クライアントが
  • 適切なlevel_of_detail制約を指定するために知っておく必要がありますいくつかのプロセスは、平均の行を構築するための責任にする必要がありますサンプルがテーブルに追加されます
+0

ハイ、ロー、クローズ、オープンのような金融チャートが表示される理由はありません。それは、ある期間にわたって見やすい日中の傾向(あなたの傾向はあなたの友人です)と動きを示しています。 – u07ch

答えて

2

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 
関連する問題