• ベストアンサー

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

  • データの取得に関して

    データを取得する際、表示開始日の午前10時になったらデータを取得するような形にしたのですが、 下記のようにすると、その日になると同時に取得してしまいます。(10時より前に) 例えば、表示開始日が11月1日だった場合、 11月1日の10時になったら表示するようにしたいのですが、どういう感じにすればいいでしょうか。 <?php $time=date("H"); if($time>9) { select * from test where start<=getdate() } else { select * from test where start<getdate() }

    • 締切済み
    • PHP
  • SQL Server で 翌月10日を取得する

    SQL Server で 翌月10日を取得する方法を教えてください。 isnull(convert(char(10),dateadd(month,1,(dateadd(day,9,DATE))),111),'') as DATE ↑これだと、DATE(月末)の翌月の9日後で、翌月10日も可能なのですが、 当然ながら、DATEが月末とは限らないので。。。 常に10日を固定で表示するにはどうしたら、よいのでしょうか? よろしくお願いいたします。

  • batでsqlplusによる前月データを取得

    sqlplusにてbatファイルを起動するだけで前月のデータを取得しようとしていますが、 ネットで検索等してもなかなかうまく行きません。 以下のようにbatファイルを起動すると、常に前月のT_URIのデータを取得させたいのですが、 どのようにすれば宜しいでしょうか?ご教示頂けると助かります。(期間の日付をじかに入力すれば、取得できたのですが、同じように取得したいテーブルが複数あるので) 月初日は常に1日、月末日は常に31日にして、前月をbatファイルかsqlファイル上で計算させる方法はないのでしょうか? (会社の業務でoracleのデータベースから抜き出そうとしています。) SQLPLUS ABCD/ABCD@ORACLE.XYZ.WW @0031_ymd.sql PAUSE ↓0031_ymd.sql set heading on set echo off set underline off set termout off set pause off set pagesize 0 set trimspool on set feedback off set termout off set linesize 1000 set lines 30000 spool D:\hoge.csv SELECT * FROM T_URI S WHERE AND S.KJN_YMD >= yyyymmdd AND S.KJN_YMD <= yyyymmdd

  • postgreSQLで更新後のデータを取得したい。

    postgreSQLで更新後のデータを取得したい。 初めて質問させていただきます。 postgreSQLでupdateした後、更新後のデータをselectで取得したいのですが、 トランザクションが完了するまでにselect文が発行されているみたいで、更新前のデータを取得してしまいます。 それぞれ、違うファイルから投げられているので、同じトランザクションにすることはできません。 何かいい方法があればご教授お願いします。 a.phpで下記のSQLを発行 update test_tbl set test1 = 'aaa' where test2 = 'bbb' a.phpが走っている間に、下記のb.phpが実行される。 select test1 from test_tbl 環境 php5 postgres8.1

  • VBAで月末日の求め方について

    Excel VBAでUserForm1で年月日を入力すると、その月の月末日を取得したいと思っています。 下のようなプログラムにすると、 「2006/3/1」と入力された場合は、lasDayに「31」が取得されるのですが、    myDate = TextBox1.Text    lasDay = Day(DateAdd("d", -1, DateAdd("m", 1, myDate))) 「2006/3/5」などと入力された場合もlasDayに「31」を取得するには どのようにしたらよいのでしょうか。 また、入力された日にちが25日以降の場合は、 翌月の月末日の値を取得したいのですが、どのようにしたらよいのでしょうか。 (例:「2006/2/25」と入力したら、lasDayは翌月(3月)の月末日「31」を取得) どのたか回答お願いします。

  • ExcelVBAで、フィルタリング後の一覧から値を取得

    ExcelVBAで、フィルタリング後の一覧から値を取得方法について質問です。 100件のデータから、フィルタの条件で10件程度に絞り込んだ場合、その列の値を、配列に突っ込みたいのですが、この場合、どうすればよろしいでしょうか? もうちょっと、詳しく↓ ↓フィルタリング条件 Range("B7").Select Selection.AutoFilter Field:=2, Criteria1:="=?n????", Operator:=xlAnd ↓取得したい値 Range("B8").Select から B列でフィルタリングのデータが存在するまで。 ※現状 下セルに移動するために、「Selection.Offset(1, 0).Select」を使っていたのですが、フィルタリングの条件を無視して行を選択されてしまいます。 この場合の、コマンドを教えていただければ助かります。

  • EXCEL20001分ごとのデータを抽出したい

    お世話になっておりますm(__)m(このごろは頻繁に(^^ゞ) タイトルどおり、1分ごとのデータを抽出したいのです。 データは次のようになっています。 A列1行目から縦に日付です。 2002/1/1 2002/1/1 2002/1/1 2002/1/1 2002/1/1 2002/1/1 上記のように同じ日付がずーっとつづいています B列1行目から縦に時間です。 0:30:04 0:30:06 0:30:08 0:30:10 0:30:12 0:30:14 0:30:16 ・ ・ ・ 上記のように2秒ごとにデータがあるのです。 ただし、C列にもその日付と時間に対応したデータがあります。 2秒ごとにデータがあるのですが、 それを1分ごとのデータを抽出したいのです。 どうにかこうにかしてできないものでしょうか? 関数とかでできるでしょうか? VBAとかはぜんぜんやったことがないので、 もしそれをつかわなければ出来ない場合は、 詳しく説明してくださればうれしいです(涙

  • 2つのテーブルのデータまとめて取得したい

    SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。

  • データ取得

    name*****key1****key2****date ------------------------------- AAA*******1*******1*****2003/01 BBB*******2*******2*****2002/12 AAA*******1*******2*****2003/01 BBB*******1*******2*****2002/11 BBB*******2*******2*****2002/11 AAA*******2*******2*****2003/01 AAA*******2*******2*****2002/12 ------------------------------- (※全てのフィールドが同じ情報のレコードはない) ****は意味はありません。表を見やすくするために書いただけです。 上記のテーブルから下記のデータを取得したいと 考えています。 AAA*****2002/12*****1 AAA*****2003/01*****3 BBB*****2002/11*****2 BBB*****2002/12*****1 name列とdate列の重複しないレコードの件数を取得したいのですが どのようなSQLを記述すればよろしいでしょうか?

  • VB.NETでソートされたデータセットの取得

    データ数が数十万レコードのテーブルがあります。 ここから上位1000件のレコードをデータセットに取得したいと思います。 しかし、この時点でソートがかけられないのでビューを作成時にソート をすることになると思います。 レコード数が少ない場合は、これでもいいのですが、多くなると、データ セットに取得する時点でかなり時間がかかります。 この場合、どういった方法が最適でしょうか? リーダーを使うのが普通でしょうか?