• ベストアンサー

5分ごとのデータ取得

1分ごとの時間がセットされている列があります。 ある時間から5分ごとの時間を全て取得したいと思います。 取得したいデータは1日の00:00から月末の23:55までです。 難しいのは、5分ごとのデータがない場合があり 無かった場合は1つ前のデータ(1分前でもなんでもいいから直近で1コ前) を取得するということです。 select DATEADD(n, 5, '2009/06/01 00:00:00') で5分後は分かるのですが1こしか取れないので どうしたらいいか困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

>5分以上データが取得できなかった時にもその時刻のデータを直前のデータで補完したいです。 テーブルの中身が2009/06/01 00:00:00の1レコードしかなかったと仮定してください。 指定時刻が2009/06/01 00:00:00であった場合(これ以降5分おきに取得)、 2009/06/01 00:00:00 2009/06/01 00:00:00 2009/06/01 00:00:00 2009/06/01 00:00:00 ・・・・・ 2009/06/01 00:00:00 と(2009/06/30 23:55:55までの)8,640件を返したいという意味ですか? (テーブルの中身が1件もない場合は8,640件のNULLが返される) だとすると、1クエリでの実行は無理です(1件しかないデータを8,640件にすることはできないから)。 Transact-SQLのコードを書いてください(これもまた一例ですが)。。 DECLARE @T datetime --指定時刻 SET @T='2009/06/01 00:00:00' DECLARE @WT datetime DECLARE @WTBL TABLE (T datetime) SET @WT=@T WHILE (MONTH(@WT)=MONTH(@T)) BEGIN INSERT INTO @WTBL VALUES (@WT) SET @WT=DATEADD(n,5,@WT) END SELECT (SELECT MAX([時刻]) FROM TIMETBL WHERE [時刻]<=t.T) FROM @WTBL t

taku_pon
質問者

補足

ありがとうございます。 >(2009/06/30 23:55:55までの)8,640件を返したいという意味ですか? >(テーブルの中身が1件もない場合は8,640件のNULLが返される) やりたいことはそういうことです。 VB2008からSQL Server2008にデータを取りにいきます。 プログラムで5分ごとの時間が入った配列を作って 1レコードずつ素直に検索しにいくのとどっちが早いでしょうか? 8,640件の検索が最大で16セット発生します。 LINQというやつでもだめなのかな~。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

>プログラムで5分ごとの時間が入った配列を作って1レコードずつ素直に検索しにいくのとどっちが早いでしょうか? 8,640回クエリを実行しようと思っているならば、圧倒的にその方が遅いです。 8,640件×16のデータを取ってきて、最終的に必要なのが何か読めませんので、なんとも言えませんが、 8,640件×16のデータ全部を使わず、絞り込むのであれば、8,640件×16のデータを取ってくること自体がナンセンスです。 最初から必要なものだけ拾ってくればいいと思います。 >LINQというやつでもだめなのかな~ LINQは処理速度をアップするためのものではありませんよ。

taku_pon
質問者

お礼

やっぱり遅いですか。 全部取ってきてループさせようと思います。 何度も返信ありがとうございます。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

あくまで一例ですが。。 データを指定時刻からの経過時間で5分単位のグループにして(ただし、ちょうど5分のボーダーのところは下のグループに含めるために1引く)、その中で逆順に連番を振り、各グループの1番目だけ抽出する。 SELECT [時刻] FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY (DATEDIFF(n,'指定時刻',[時刻])-1)/5 ORDER BY [時刻] DESC) SEQ FROM TIMETBL WHERE [時刻]>='指定時刻') tmp WHERE SEQ=1

taku_pon
質問者

補足

ありがとうございます。 だいたいできている気がしますが、 1日の00:00が取得できないことと 5分以上データが取得できなかった時にも その時刻のデータを直前のデータで補完したいです。

関連するQ&A