• 締切済み

MAX関数と範囲指定

AのデータをBにコピーをしたいのですが、AからBにうつすときはその日の一番新しいものだけにしたいのです。 例えば、昨日と一昨日のデータの一番新しいやつをコピーしたいのです。今日のデータが入っているので単純にMAXで取り出せないのです。 INSERT INTO B (DATE,NAME,ID) SELECT (DATE,NAME,ID,更新日時) FROM B WHERE DATE = (SELECT MAX(DATE) FROM A WHERE DATE BETWEEN 一昨日 AND 昨日); 根本的に違っているんでしょうか

  • bobT
  • お礼率0% (0/2)
  • Oracle
  • 回答数2
  • ありがとう数1

みんなの回答

  • xKENx
  • ベストアンサー率65% (21/32)
回答No.2

#1さんのおっしゃるようにテーブルの定義があいまいで、特に一意となるキーがわからないのでなんともいえない部分もありますが。 いずれにしても、ご自身で書かれているように"DATE"が同日ごとに最大のレコードを取り出す必要があるため、ひとつのDMLでは難しいのではないでしょうか。日付ごとにループ処理するのが簡単と思います。 PL/SQLでサンプルを書いてみましたので参考になれば。 DECLARE CURSOR C IS SELECT TRUNC("DATE") DATE_MAX FROM A WHERE UPDATED BETWEEN '一昨日' AND '昨日' GROUP BY TRUNC("DATE"); BEGIN FOR R IN C LOOP INSERT INTO B (DATE,NAME,ID) SELECT DATE,NAME,ID FROM (SELECT * FROM A WHERE TRUNC("DATE") = R.DATE_MAX ORDER BY "DATE" DESC ) WHERE ROWNUM = 1 ; END LOOP; COMMIT; END;

回答No.1

>根本的に違っているんでしょうか A、Bのテーブルに関すること(カラム等)を説明していないので、 違っているかなんてわからない、というのが感想です。 ただ、はっきりしているのは。 >INSERT INTO B (DATE,NAME,ID) >SELECT (DATE,NAME,ID,更新日時) FROM B >WHERE DATE = (SELECT MAX(DATE) FROM A WHERE DATE >BETWEEN 一昨日 AND 昨日); このSQLは、テーブルAの最大DATEを一件だけ選択し、それをキーに テーブル”B”を拾い出して、テーブルBへ登録します。 ・1件しか選択していない。 ・テーブルAから拾い出さないといけない。 ・拾い出した項目数が3つなのに、登録先のカラムは2つだけ記述。 というところが、おかしいと感じるところです。 あくまで、想像ですが・・ insert into B select * from A where "DATE" in (select "DATE" from A where "DATE" between ~ group by trunc("DATE",'dd'); な感じになるかと思います。 蛇足ですが、"DATE"のような予約語は、カラム名や変数としては、使わない方が良いです。

関連するQ&A

  • 最後のデータを含むレコード1行 MYSQL

    お世話になります。 最後の日にちを含むレコード全ての抽出方法がどうしてもわかりません。 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 4 AA 3/2 7 5 BB 3/2 4 6 AA 3/3 1 これを、select * from テーブル group by name とすると、 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 select id, name, max(date),amount from テーブル group by name とすると、 id name date amount 1 AA 3/3 5 2 BB 3/2 5 3 CC 3/1 5 望んでいる結果はこうです。最後のdateを含むレコード全てです。 id name date amount 3 CC 3/1 5 5 BB 3/2 4 6 AA 3/3 1 select * from テーブル as a where a.date=(select max(b.date) From テーブル as b where a.id=b.id); このようにしましたが、データの数が膨大なのですごく時間がかかってしまいます。 他、シンプルな方法はないでしょうか。 よろしくお願いします。 MYSQL バージョン5.0.45

  • maxについて

    SELECT A.DATA1,A.DATA3 FROM DATABASE A, (SELECT MAX(DATA1) AS DATA1,DATA2 FROM DATABASE GROUP BY DATA2) B WHERE A.DATA1 = B.DATA1 AND A.DATA2 = B.DATA2 DATA2でグループ化した最大のDATA1と同行のDATA3を取得する際に、 上記のように記述しています。 もっと簡単に取得する方法はあるでしょうか?

  • 副問い合わせを使わずに書く方法

    テーブルAとBがあり、どちらも列idとnameがあります。Aのnameは最初はNULLです。AのnameをBから持ってきてUPDATEしたい(AのidのうちBにあるもののnameをAにコピーする)のですが、MySQLのバージョンが古く、副問い合わせが使えず、以下のようなことができないので困っています。どなたか教えていただけませんか。 UPDATE A SET name = ( SELECT name FROM B WHERE A.id = B.id ) WHERE EXISTS ( SELECT 'X' FROM B WHERE A.id = B.id ) ;

    • ベストアンサー
    • MySQL
  • 重複レコードのある項目を比較し更新する方法

    nameで重複しているレコードをDateの 最新の日のレコードのIDをTGT_IDに入れたいのですが select * from テーブル名 where name in ( select name from テーブル名 group by name having count(*) > 1 ) と重複したカラムを抽出まではできるのですが そこからどうしたらいいのか分かりません どなたかご教授をお願いします。 ID name date tgt_id 1 A 20040403 2 2 A 20040625 2 3 B 20040429 4 4 B 20040623 4

  • MAX関数と複数問い合わせ?

    Oracle8 Release 8.0.5.0.0 - Production を使用しています。 以下のテーブル内容から、社員ごとの一番新しい日付のデータを取得したいのですがお知恵をお貸しください。 t_table ------------------------------- 社員番号     作成日付 1         2003/04/07 13:03:57 1         2003/04/05 13:03:57 2         2003/04/10 13:03:57 3         2003/03/01 13:03:57 欲しい結果 1         2003/04/07 13:03:57 2         2003/04/10 13:03:57 3         2003/03/01 13:03:57 です。 select a.社員番号, a.作成日時 from t_table a, t_table b where a.社員番号 = b.社員番号 and b.作成日時 = (select max(作成日時) from t_table) とやると、 1         2003/04/07 13:03:57 1         2003/04/05 13:03:57 だけ持ってきてしまいます。 あと、できればDB2でも使えるようなSQL文にしたいのですが・・・ これはできればでかまいません。 宜しくお願いいたします。

  • MAX関数を使ってからLEFT JOINしたいのですが・・

    毎度お世話になります。 下記2つのテーブルからテーブル結合をして表示させたいのですが、その前にサブテーブルにある時間データの中で最新のものだけと結合したいと考えています。色々試したのですがうまくいきません。どなたかご教授の程よろしくお願いいたします。 main_tbl | id | basyo | name | --------------------- | 1 | 1  | aa  | | 2 | 1  | bb  | | 3 | 2  | cc  | | 4 | 3  | dd  | sub_tbl | id | jyotai | time  | ------------------------ | 1 | 1   |12:25:30| | 1 | 2   |13:15:12| | 2 | 1   |13:20:14| | 1 | 3   |13:50:08| 欲しい結果 | id | basyo | name | jyotai | time | --------------------------------------- | 1 | 1  | aa  | 3   |13:50:08| | 2 | 1  | bb  | 1   |13:15:12| | 3 | 2  | cc  | null  | null | | 4 | 3  | dd  | null  | null | 考えた構文 $sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN (SELECT MAX(time) FROM sub_tbl GROUP BY id) ON main_tbl.id = sub_tbl.id"; または $sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN sub_tbl on main_tbl.id = sub_tbl.id WHERE SELECT MAX(time) FROM sub_tbl GROUP BY id"; または $sql1 = "SELECT MAX(time) FROM sub_tbl GROUP BY id"; $rs1 = mysql_db_query($db,$sql1) or die("sql Error!"); $sql = "SELECT main_tbl.id, main_tbl.basyo,main_tbl.name, $rs1.jyotai, $rs1.time FROM main_tbl LEFT OUTER JOIN $rs1 ON main_tbl.id = $rs1.id"; ~以下クエリの実行と表示文~ どれも駄目でした。(クエリエラー表示) 因みに結合のみとMAX関数を別々に実行すると表示できることを確認しています。 環境は WinXP Mysql5.0.41 php5.2.3 です。 まだまだ勉強中ですのでよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • データの無いテーブルと結合してデータ抽出

    以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0   AA 1   BB 2   EE 3   FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2   2004   CC 3   2004   DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0   AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY =  (SELECT MAX(C.DAY)  FROM 履歴 C  WHERE  A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。

  • Accessで最小値と最大値を一度で取得する方法

    OS:WinXP Access:2000 下記の状態にしたいのですが よいSQL文が思いつきません。 MINのみのデータを抽出する方法は分かるのですが select ID,Name,Min(Date) from tblA group by ID,Name,Date MAX(Date)も出力しようとすると、Dateが最小のNameの出力方法が分かりません。 テーブル(tblA) ID|Name|Date --------------- 01|C |8/10 01|A |8/11 01|B |8/12 ↓ クエリ実行後 ID|MIN(Name)|MIN(Date)|MAX(Date) ----------------------------------- 01|C |8/10 |8/12 よろしくお願いいたします。

  • 速度向上。

    速度向上。 Select A,B,C, (Select Count(*) FROM T_A WHERE SOME_ID = A.SOME_ID ) COUNTER , (Select MAX(REGISTER_TIME)FROM T_A WHERE SOME_ID = A.SOME_ID)MAX_REG_TIME FROM T_A as A WHERE ID LIKE '%1%' GROUP BY ID ORDER BY MAX_REG_TIME; テーブルT_AからIDに1が含まれるデータを全て抽出し、かつそれぞれのカウントを抽出し、かつ最新更新日でソートしたいと思います。 データ数が2000程度のテーブルで30秒ほどの時間がかかります。 より速くする良い方法はありますでしょうか?

    • ベストアンサー
    • MySQL
  • よければ教えて頂きたいです。

    先ほど教えて頂いた 'SELECT kid,id,name,day,tday FROM em WHERE kid='.$_SESSION["kid"].' AND (name,day) IN (SELECT name,MAX(day) FROM em GROUP BY name)'; だと正常に表示されましたが指摘通り最大値が同じ日があれば二つ表示されるのを防ぐためスタート時間も加えてみました。 'SELECT kid,id,name,day,tday,st FROM em WHERE kid='.$_SESSION["kid"].' AND (name,day,st) IN (SELECT name,MAX(day),MAX(st) FROM em GROUP BY name)'; stという部分です。これを加えたところ、一つの名前が表示されなくなりました。 表示されなくなったデータと他のデータを比べても差異がないので、原因がよくわからないのですが、。。

    • ベストアンサー
    • PHP