• 締切済み

SQLで、同じ値が何回連続するか、カウントする方法

1年間の天気のデータベースがあるとします。 7月のデータを抽出し日付でソート、ある日付から、その日と同じ天気が何日続いたかを、SQLで簡単に調べる方法はあるでしょうか? データベースは、ACCESSのmdb、VBでJETデータベースエンジンを使用していますので、高度なSQL文は使用できないかもしれません。 よろしくお願いします。

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

手元に ACCESS が無いので動作未確認ですが、下記のSQLではどうでしょうか? (weather テーブルに、日付/時刻型のdateカラムと文字列型のweatherカラムが有ると仮定) SELECT date, weather, DateDiff("dd", date, (SELECT MIN(date) FROM weather c WHERE a.date < c.date AND a.weather <> c.weather)) AS weather_count FROM weather a WHERE NOT EXISTS (SELECT * FROM weather b WHERE a.date - 1 = b.date AND a.weather = b.weather) AND date BETWEEN '2013-7-1' AND '2013-7-31' ;

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

2013年7月東京の天気、 曇晴曇曇曇晴晴晴晴晴晴晴曇晴曇晴晴晴晴曇晴晴雨曇曇晴晴晴曇晴晴 ――を、日付と天気の組として格納したテーブルWea1があったとして、 こんなのとか: SELECT Wea1.WatchDay, Wea1.Weather, q3.Days FROM (SELECT q2.WeatherBreak, Min(q2.WatchDay) AS WatchDay, Max(q2.WatchDay)- Min(q2.WatchDay)+1 AS Days FROM ( SELECT w2.WatchDay, Sum(q1.WeatherBreak) AS WeatherBreak FROM Wea1 As w2 INNER JOIN ( SELECT Wea1.WatchDay, IIf(q.WeatherYesterday=Wea1.Weather,0,1) AS WeatherBreak FROM Wea1 LEFT JOIN ( SELECT [WatchDay]+1 AS WatchDay1, Wea1.Weather AS WeatherYesterday FROM Wea1 ) AS q ON Wea1.WatchDay = q.WatchDay1 ) As q1 ON w2.WatchDay >= q1.WatchDay GROUP BY w2.WatchDay ) As q2 GROUP BY q2.WeatherBreak) AS q3 INNER JOIN Wea1 ON q3.WatchDay=Wea1.WatchDay;

MusaGoro
質問者

お礼

早々に回答頂き、ありがとうございます。 正にこういうことなのですが、やりたいことを、もう少しシンプルにします。 ある期間のデータを抽出し日付でソート、その最初の日の天気と同じ天気が何日続いたかが分かれば結構です。 お手数をお掛けしますが、再度ご教授頂けると有難いです。

関連するQ&A

  • VBからCrystalReportsへSQL文を渡すには?

     VBからCrystalReportを呼び出し、CrystalReports側でSQL文実行させたいのですが、ヘルプ等を見ても方法がわかりません。  例えば・・・ 1 VBで入力画面を用意し、抽出条件を入れさせる。 2 入力された条件にてSQL文を生成しSQL-Serverから該当行を抽出する。 3 CrystalReportsで作表する。  VBでSQL文を生成し、例えばMDBに書き出し、それを単純にCrystalReportsで読むということは出来たのですが、中間ファイル(この場合はMDB)を作らずに同様のことができるのでしょうか?  つまり、VBから制御されたCrystalReportsでDBから条件抽出をかけつつ作表するということが可能か否か、可能であるならばその方法をご教授いただけると幸いです。

  • VBを使ってる初心者です【SQL】【Access】

    VisualStudio2008で、Access2010のデータベースからデータ抽出を行えるアプリを作っています。 このときSQL文を用いてAccessからデータ抽出を行うんですかね? そもそもVisualStudio、SQL、Accessそれぞれがどのように関係しているのかわかりません。 いくつかサイトを見て回ったのですが・・・ 教えてほしいこと 1. データ抽出アプリを作るにあたってVisualStudio、SQL、Accessの各々がどのような役割を果たすか 2. Accessのデータベースの形式は空or Webどちらが有効なのか 3. VisualStudioでデータの抽出を行う方法 長くなりましたがよろしくお願いします。 開発言語はVBで、私自身は簡単なプログラムであれば理解できるレベルです

  • VS2005でSQLを実行したいんです。

    Visual studio 2005(C#を使っています)でAccessのデータベース(mdbファイル)を扱っているのですが、プログラムを実行する度に(データベースの)あるフィールドの最大値・最小値を取得出来るようにしたいと考えています。その為、SQL文をmdbファイルに対して実行し、その結果を数値として取得したのですが、その手段がなかなか見つかりません。 mdbに対してSQL文を実行する方法をご存知の方がいらっしゃいましたら、どなたか教えて頂けないでしょうか。宜しくお願いします。

  • ACCESS VBAでSQL Server使用

    ACCESS VBAでSQL Server使用しています。 データ量が多い場合、 リンクテーブルを張ってDocmdでJetデータベースエンジンを使う方法と SQL ServerにADOで接続してT-SQLを使用する方法ではどちらが早いでしょうか?

  • SQLについて

    SQLについて質問です。 現在vbからmdbファイルにある日付間のデータを取得するようなsqlをなげているのですがうまくいかないのでお知恵をお貸しください、、、 sql文は ("select * from ABC where date between ""'" & hiniti & "'"" and ""'" & hiniti2 & "'"" ;") hinitiには日付(2006/4/5)hiniti2には(2006/7/4)のように日付が入ったとするとデータは2006/4/5以降から2006/7/4までしか取得してこないのです。 BETWEEN 演算子は境界値も含むらしいので2006/4/5のデータが取れない理由がわかりません。 日付が文字列というのが問題あるのでしょうか?

  • VBでSQL-serverをプログラムする

    VBでmdbファイルを操作するプログラムを勉強していますが、データベースをサーバー管理するならば、AccessではなくSQL-serverなどを使った方が良いと聞きました。 質問なんですが、 SQL-serverには、Accessと同じようにユーザーフォームを使ってデータベースシステムを構築するような機能が付いているのでしょうか? そもそもOracle、dBase、SQL-serverといったデータベースソフトは、DBそのものを作成するソフトであって、DBシステムを構築するにはVBなどによるプログラム開発が必要なのでしょうか? 分かりにくい質問ですみません。

  • 多数のフィールドをSQLで書き込む方法?(VB08

    VB2008にてアクセスMDBに対し、SQL文を使用し、特定のテーブルの1レコードへ多数の項目(フィールド)を書き込む際に効率的な方法はないでしょうか? 仮に100項目だとして、INSERT INTO文がとても長くなってしまう代わりに、処理を分散させるコーディング方法は何かないでしょうか?

  • VB.NETのSQL文について

    質問失礼します。 VB、SQLともに勉強しはじめて日が浅い初心者ですが、どなたかお力をお貸しください。 データベースに登録しているデータをNPOIを使って、出力したいと考えています。 DataTableを使用して作りましたが、上手くできない部分があります。 テーブルのカラムは、社員番号、事務物販名、登録数、登録日、更新日のようなものが入っているイメージです。 登録日を検索して、全てのテーブルを抽出したいのですが、○月○日〜○月○日にデータを登録した人というときに、つまづいてしまいました。 SQL.Append("SELECT " ) ・ ・ SQL.Append("WHERE ") SQL.Append(" 登録日 BETWEEN パラメータ1 AND パラメータ2 ) のように、書いたところ問題なく、出力されました。 パラメーターの部分は、DateTimePickerコントロールを配置して、日付を入力した値を設定しています。 2023/1/1 と 2023/1/2と2つ入力して、この2日間のデータを出そうとしたところ、1/1の文しか出力されませんでした。 原因は、データベースに入っているのは、Date型で、YYYY/MM/DD HH:mm:SS形式でした。 1/2の0時以降は、該当データに含まれないということは分かっているのですが、それを含めてのSQLの書き方がわかりません。 単純にSQLを書くには、 BETWEEN 2023/1/1 AND 2023/1/2 23:59:59 で、2日の文を抽出されますが、VBに書く時がうまくできない状態で、 時間の部分を、結合すれば良いのかと思い、 SQL.Append("SELECT " ) ・ ・ SQL.Append("WHERE ") SQL.Append(" 登録日 BETWEEN パラメータ1 AND パラメータ2 II '23:59:59' ") と、DataTimePickerから持ってきた、パラメータの日付に時間を結合してみたところ、ダメでした。 型の問題なのか、よくわからず、勉強している状態です。 基礎がなっておらず、初歩的なミスかと思いますが、ご指導ください。 データベースはOracleを使用しています。

  • VBとSQLで、、、、

    私は最近ソフトウェアの開発に携わることになりました。 私自身プログラミングの経験は全くありません。 何を命じられたのかといいますと、VBとSQLをつかって、サーバー上の  データベースにクライアントからアクセスして、ほしいデータだけをもってくる  業務を支援するようなソフトを作るのです。 例えば、ユーザーが日付の範囲だけをいれると、その間に店を訪れた人のすんでい  る地域別、さらにそのお客の年代別で何人いるのかというようなものが  ボタンひとつでだせるようなものなんです。 まったく知識がなくてとりあえずVBの基本とSQLコマンドの本を片手に  やっています。(あと、アクセスでおおよそのデータベースについて学びまし  た) で、結局何がいいたいのかと申しますと、VBとSQLを利用したデータベースの  構築に関する良い文献を紹介していただきたいのです。 VBは初心者なのでとりあえず、それようのものを。 あと、ストアドというものを駆使するらしいので、それについての詳しい本を  紹介してください。サイトなんかでもよいです。 それでは、よろしくお願い致します。  (多分、質問の内容もわけのわからないことを言ってるかもしれません^^;)

  • ネットワーク上のDBにアクセス時にエラー

    VB6.0 + Access2003を使用しています。 ネットワーク上にMDBがあり、複数の端末からアクセスしています。 MDBにはADO接続で、共有モードで開いています。 複数の端末から同時にOpenし、同じテーブルにアクセス(Select文実行) した場合に、 エラー番号:-2147467259 内容:Microsoft JET Database Engineでエラーが発生しました。     データベース"を開くことができません。アプリケーションで認識できない    データベースであるか、またはファイルが破損しています というエラーが発生します。(ファイルは破損していません) 3、4台で同時アクセスを何度が試していますが、 毎回このエラーが出ることはなく、エラーが出る原因がわかりません。 原因、対処方法などわかりましたら教えてください。 よろしくお願いします。