SQL文(クエリ)の教授と検索方法の説明

このQ&Aのポイント
  • Oracle8においてテーブルt_tempに蓄積されるデータを用いて2つの検索を行いたい。1つ目は号機ごとに基板温度が50度以上となった最初の日付と基板温度を検索する方法であり、2つ目は号機ごとに基板温度が最高温度の日付と基板温度を検索する方法である。
  • 参考書等を調べても具体的な方法が見つからないため、クエリ例とその説明を教えていただきたい。
  • 実行環境はMS-ACCESSからパススルークエリを使用している。追加の情報が必要な場合は指摘してほしい。
回答を見る
  • ベストアンサー

SQL文(クエリ)をご教授ください。

SQL文(クエリ)をご教授ください。 Oracle8において下記のようなテーブルが有り、復数台の装置に関して 毎日365日データを蓄積しています。 日によってデータが採取できない装置があるため、号機に抜けが 生じる事があります。 また実際は装置は14000台程度のデータを収集しています テーブル名:t_temp 号機  日付   基板温度 Disk温度 外気温度 01  2010/03/01  50    70    25 02  2010/03/01  49    73    25 03  2010/03/01  52    72    25 04  2010/03/01  49    71    25 01  2010/03/02  56    77    26 02  2010/03/02  57    75    26 04  2010/03/02  55    74    27 01  2010/03/03  49    71    24 03  2010/03/03  50    72    25 04  2010/03/03  48    70    23      以下データは続く このテーブルから、以下のような2パターンの検索をしたいと考えています。 1.号機ごとに、基板温度が50度以上となった最初の日付と基板温度を検索 2.号機ごとに、基板温度が最高温度の日付と基板温度を検索 参考書なども眺めてみたのですが、糸口が見出せずにいます。 クエリ例と、その説明を説明をいただけると幸いです。 実行環境は、MS-ACCESSからパススルークエリで実行しています。 補足が必要でしたら、ご指摘いただけると幸いです。 皆様のお力を借用したく、お願いいたします。

  • Oracle
  • 回答数3
  • ありがとう数20

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

t1、t2はエイリアス(別名)です。 fromの後ろでselectしているのでt2というテーブルに見せかけてます。 元テーブルはt_tempだけなのですがselect  from で2つのテーブルを扱っているように見せてます。 RDBの例題で、社員マスタに社員/上長が混在しているようなサンプルがあると思いますよ。 Oracle の EMPLOYEES等のサンプル

number1185
質問者

補足

度々すみません。 1項、2項ともt1,t2を使用しない例で検証してみました。 結果は残念ながら上手くいきませんでした。 ODBCの呼び出しが上手くいかないようです。 SQL Plusから実行してみたいと思います。 ところで追加の質問があります。 "where (号機, 日付) in"または"where (号機, 基板温度) in "といった 記述をされていますが、通常は "where 列名 in (値1, 値2)"といった使用方法ではないのでしょうか。 例で記述していただいた書式ですと、どのような意味になるのでしょうか。 よろしければご教授ください。 よろしくお願いいたします。

その他の回答 (2)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

#1です。すみません。From忘れてましたね。 1.号機ごとに、基板温度が50度以上となった最初の日付と基板温度を検索 select 号機, 日付, 基板温度 from t_temp where (号機, 日付) in (  select 号機,min(日付)  from t_temp  where 基板温度 >= 50  group by 号機 ) order by 号機 または select t1.号機, t1.日付, t1.基板温度 from t_temp t1, (select 号機, min(日付) as 日付  from t_temp  where 基板温度 >= 50  group by 号機 ) t2 where t1.号機 = t2.号機 and t1.日付 = t2.日付 order by 1, 2 のほうがわかりやすいかも。 2.号機ごとに、基板温度が最高温度の日付と基板温度を検索 select 号機, 日付, 基板温度 from t_temp where (号機, 基板温度) in (  select 号機,max(基板温度)  from t_temp  group by 号機 ) order by 号機, 日付 または select t1.号機, t1.日付, t1.基板温度 from t_temp t1, (select 号機,max(基板温度) as 基板温度  from t_temp  group by 号機 ) t2 where t1.号機 = t2.号機 and t1.基板温度 = t2.基板温度 order by 1, 2 のほうがわかりやすいかも。

number1185
質問者

お礼

早速のご回答ありがとうございます。 実機で検証してみます。 ところで、"select t1.号機, t1.日付, t1.基板温度"のところの "t1.号機"などは、どのような意味になるのでしょうか。 t1やt2を使用した例での、 select以下の部分、from以下の部分等々が、 正直どのような意味合いの記述なのかがわかりません。 それぞれ二つの記述例を見比べるしかないのでしょうか。

number1185
質問者

補足

度々すみません。 1項、2項ともt1,t2を使用しない例で検証してみました。 結果は残念ながら上手くいきませんでした。 ODBCの呼び出しが上手くいかないようです。 SQL Plusから実行してみたいと思います。 ところで追加の質問があります。 "where (号機, 日付) in"または"where (号機, 基板温度) in "といった 記述をされていますが、通常は "where 列名 in (値1, 値2)"といった使用方法ではないのでしょうか。 例で記述していただいた書式ですと、どのような意味になるのでしょうか。 よろしければご教授ください。 よろしくお願いいたします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

実機での試験をしてませんが。 1は、50度以上になったことが無いと号機が返りません。必要に応じて外部結合を検討してください。 特に2は、最高温度が複数日あるとおかしくなるかも。 いずれも、副問い合わせ()内のSelectで、あたりをつけます。 外側のSelectのWhereを()で列挙するところがポイント。 1.号機ごとに、基板温度が50度以上となった最初の日付と基板温度を検索 select 号機, 日付, 基板温度 where (号機, 日付) in (  select 号機,min(日付)  where 基板温度 >= 50  group by 号機 ) order by 号機 2.号機ごとに、基板温度が最高温度の日付と基板温度を検索 select 号機, 日付, 基板温度 where (号機, 基板温度) in (  select 号機,max(基板温度)  group by 号機 ) order by 号機, 日付

関連するQ&A

  • <テーブル>

    <テーブル> 年月日、号機、装置温度、外気温度、時刻 Oracle8において上記のテーブルが有り、復数台の装置に関して 毎日365日データを蓄積しています。 ある一定期間の範囲で、月毎に装置ごとに装置温度の最高、最低、平均、 求めたいのですが、select文はどのように記述したらよいのでしょうか。 select 号機, MAX(装置温度),min(装置温度),avg(装置温度) from テーブル where sdate between '2009/08/01' and '2009/08/02' group by 号機; 上記のような記述で、一定期間における最大、最低、平均は求まりました。 これを月毎に求めたいのです。 結果は以下のように表示させたいと考えています。 号機、8月装置最大温度、8月装置最低温度、8月装置平均温度、9月装置最大温度、9月装置最低温度、9月装置平均温度… よろしくお願いします。

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • SQL UPDATE 文 GroupByの値を更新したい

    SQLの UPDATE文について質問させていただきます。 テーブル内のデータを日付と時間で GroupBy して カウント求めています。 求めた値(カウント)を、日付をキーにして同じテーブル内のフィールドに更新するSQLを作成したいと考えています。 GroupByして、カウントを求めることはできるのですが、 どうしても、UPDATE文を実行させることができません。 この処理は、SQLで行うことはできるのでしょうか? 下記に、UPDATE前と後のテーブルデータを記載しています。 日付   時刻 20090101 0:00  20090101 0:00 20090102 0:00 20090102 0:00 20090102 1:00 20090103 2:00 ↓ 日付   時刻 カウント 20090101 0:00 2 20090101 0:00 2 20090102 0:00 2 20090102 0:00 2 20090102 1:00 1 20090103 2:00 1 よろしくお願いいたします。

  • SQL(SELECT文)を教えてください

    SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付)  Name(名称) Value(値) 20130101      a      10 20130101      b      20 20130101      c      30 20130202      a      5 20130202      b      10 20130202      c      15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。

  • 複雑なSQL文について

    SQLite バージョン3.7.10 を使用しています。 以下のサイトにソースがあります。 http://ideone.com/7FPtHL どう説明するのが適切なのかあまり分かりませんが、 よろしくお願い致します。 t5テーブルにおいて t2テーブルのt1_key1が't1_key_1' かつ t5テーブルのt3_keyに対応するt3テーブルのt1_keyに対応するt2テーブルのt1_key2の 例えば2012年1月の (t5テーブルのprofit × その日(t5テーブルのdateの日の部分)に対応した2テーブルのrate) を t4テーブルのkeyごとにグループ化してその合計値を高い順に出力したいのですが、 のですがどのようなSQL文を書けば良いのでしょうか? ※ ただし、もしt5テーブルのdateに対応する日付がt2テーブルのdateにない場合は、 t5テーブルのdateに対応する月(年も含めて)のt2テーブルのrateの平均値、 それもない場合は、t5テーブルのdateに対応する年のt2テーブルのrateの平均値、 それもない場合は、t5テーブルの全てのrateの平均値、 を取得してt5テーブルのprofitにかけたいのです。。 ※ 例えばこのデータなら 2012年1月は +----------+------+ | t4_name  | sum | +----------+------+ | t4_name_1 |500000| +----------+------+ | t4_name_2 |150000| +----------+------+ という結果が得たいです。 t5テーブルのdateの'2012-01-03 00:00:02'の日付に対応するt2テーブルのdateは存在しないので、 t2テーブルの1月(2012-01)のrateの平均値((100+200+300)/3=200)を profitにかけています。 複雑すぎるというか自分でもうまく説明できないので、 せめて※の部分のSQLの書き方だけでもアドバイス頂けないでしょうか?

  • SQLの書き方がわかりません

    下記テーブルが access上にあります。 t1 ID 日付 01 2011/8/1 01 2011/9/1 02 2011/3/1 03 2011/5/30 t2 ID 日付 01 2011/7/1 01 2011/7/30 01 2011/8/1 01 2011/8/2 01 2011/9/2 02 2011/2/11 02 2011/3/1 02 2011/8/1 03 2011/4/30 03 2011/5/29 03 2011/6/30 このデータからt1を元に ID 日付1 日付2 01 2011/8/1 2011/8/1 01 2011/9/1 2011/8/2 02 2011/3/1 2011/3/1 03 2011/5/30 2011/5/29 というデータを取得するにはどのようなSQLを書けばよいでしょうか。 具体的にはt1とt2のIDが同じで、 t2の日付がt1の日付以下で最大のレコードと紐付けたいのです。

  • SQL文を教えてください

    いつもお世話になっております。 ウェブサイトを作っているのですが、以下のようなデータを表示するのに良いSQL文が分からず悩んでいます。 ID | DATE     | DATA --+----------+----- 1 | 2010-11-11 | aaa 2 | 2010-11-11 | bbb 1 | 2010-11-10 | ccc 3 | 2010-11-12 | ddd 3 | 2010-11-11 | eee 4 | 2010-11-10 | fff 1 | 2010-11-12 | ggg 2 | 2010-11-12 | hhh 1 | 2010-11-12 | iii 3 | 2010-11-12 | jjj 1 | 2010-11-09 | kkk 1 | 2010-11-09 | lll 1 | 2010-11-08 | mmm 1 | 2010-11-08 | nnn 1 | 2010-11-07 | ooo 1 | 2010-11-07 | ppp 1 | 2010-11-06 | qqq 3 | 2010-11-05 | rrr 2 | 2010-11-13 | sss 5 | 2010-11-08 | ttt 6 | 2010-11-05 | uuu 7 | 2010-11-04 | vvv 8 | 2010-11-03 | www 9 | 2010-11-02 | xxx 10| 2010-11-01 | yyy 11| 2010-10-30 | zzz 上のようなテーブルから、各IDを10件まで日付順に取り出すことはできるでしょうか? 具体的には、1つのページに以下のように表示したいのです。 2 | 2010-11-13 | sss 2 | 2010-11-11 | bbb 1 | 2010-11-12 | ggg 1 | 2010-11-11 | aaa 1 | 2010-11-10 | ccc 1 | 2010-11-12 | iii 1 | 2010-11-09 | kkk 1 | 2010-11-09 | lll 1 | 2010-11-08 | mmm 1 | 2010-11-08 | nnn 1 | 2010-11-07 | ooo 1 | 2010-11-07 | ppp 3 | 2010-11-12 | ddd 3 | 2010-11-11 | eee 3 | 2010-11-05 | rrr 4 | 2010-11-10 | fff 5 | 2010-11-08 | ttt 6 | 2010-11-05 | uuu 7 | 2010-11-04 | vvv 8 | 2010-11-03 | www 9 | 2010-11-02 | xxx 10| 2010-11-01 | yyy ・各IDのうち、最も新しい日付のものが上にくる ・表示するIDは10件まで ・表示はIDごとにまとめて行う ・一つのIDに属するデータは10件までしか取り出さない 上記のことを実現する方法をご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL Server 2005 日付期間について(SQL文)

    恐れ入ります。 現在、SQL Serever 2005を利用し、VS 2005にて某システムを作成しています。 その中で、ある条件のデータをテーブルから削除する機能を作らなければならないのですが、以下がやりたい旨です。 [テーブル] SYSTEMTBL [定  義] systemYMD (varchar(8) ): 登録日付(例.20080725) systemHMS (varchar(6) ): 登録時間(例.103050) AAAAA (varchar(10)): カラム1 BBBBB (varchar(10)): カラム2 とあり、 SQL文を次のようにしたいです。 DELETE FROM SYSTEMTBL WHERE 登録日付 < 本日日付 - 日数 条件部分をどのようにすれば、 正しい日付の計算をしてくれるのでしょうか? 宜しくお願い申し上げます。

  • SQL文の結合(一対多)がわからない

    色々とネットで調べてみたのですが、ピンとこないので質問させていただいています。 以下のようなテーブルを想定しています。 「テーブルA」 ユニークキー データ1 データ2 ・・・ 0001 ... 0002 ... 0003 ... 「テーブルB」 キー データA データB ・・・ 0001 ... 0001 ... 0002 ... テーブルAではユニークキーは重複していないのですが、テーブルBのキーは重複しています。 このような状況で、テーブルBの”キー”とテーブルAの”ユニークキー”を照合させて、テーブルBに”データ1 データ2 ・・・”を流し込みたいと思っています。 現状では、複数の検索結果が出るためにエラーとなっています。「一対多」結合を利用するというところまではわかったのですが、そこから先がよくわかりません。 どなたか解説していただけないでしょうか。 初心者の質問で恐縮ですが、お教え頂ければ嬉しいです。

  • SQL文の書き方

    イベント情報をキーワード検索できるページを制作しており、下記テーブルからデータを取得したいのですが、日付関係の条件指定の方法が分かりません。 下記のような条件で取得したい場合どのようにすればよいでしょうか?(キーワード検索の部分はわかります) テーブル event  date_s:開始日(Ymd形式の8桁 もしくは md形式の4桁)  date_s_year:開始日の年(Y形式の4桁 もしくは NULL値)  date_s_month:開始日の月(m形式の2桁)  date_s_day:開始日の日(d形式の2桁)  date_e:終了日(Ymd形式の8桁 もしくは md形式の4桁 もしくは NULL値)  date_e_year:終了日の年(Y形式の4桁 もしくは NULL値)  date_e_month:終了日の月(m形式の2桁 もしくは NULL値)  date_e_day:終了日の日(d形式の2桁 もしくは NULL値)  ※複数日に渡って行われるイベントには終了日が入っていて、単日のイベントの終了日はNULL値です。  ※その年だけに行われる単発のイベントには年と月と日がすべて入っています。毎年決まった日に行われるイベントには月と日のみが入っており、年はNULL値です。 ・検索対象は今日から1年先までのデータ ・開催中(開始日が本日以前で終了日が本日以降)のイベント → 開始日が今日に近いイベントという順番で並べたい。 MySQL:5.1.22-rc PHP:5.2.5 説明が分かりにくいかもしれませんが、アドバイスをいただければ幸いです。

    • ベストアンサー
    • MySQL