最新日付のデータを取得する方法

このQ&Aのポイント
  • SQLを使用して、最新の日付のデータを取得する方法について教えてください。
  • 以下のようなデータから最新の日付のデータを抽出したいです。どのようにSQLを記述すればよいでしょうか。
  • 抽出後のデータは、個人番号、日付、名前、生年月日が含まれる形式で表示されることを期待しています。
回答を見る
  • ベストアンサー

最新日付のデータを取得したい

初心者でいまいちSQLが記述できませんでした。 どなたか教えてください。 以下のようなファイルから最新日付のデータを 取得したいのですが、どのようにSQLを記述したら よいかわかりません。 個人番号|日付|名前|生年月日 00000001,2001/1/1,テスト太郎/1960/1/1 00000001,2003/1/1,テスト太郎/1960/1/1 00000001,2004/1/1,テスト太郎/1960/1/1 00000002,2002/1/1,テスト花子/1945/1/1 00000002,2003/1/1,テスト花子/1945/1/1 00000002,2005/1/1,ですと花子/1945/1/1 00000003,2001/1/1,テスト次郎/1980/1/1 00000003,2003/1/1,テスト次郎/1980/1/1 00000003,2005/1/1,テスト次郎/1980/1/1 ↓抽出後 00000001,2004/1/1,テスト太郎/1960/1/1 00000002,2005/1/1,ですと花子/1945/1/1 00000003,2005/1/1,テスト次郎/1980/1/1 よろしくお願いいたします。

  • deny
  • お礼率64% (11/17)
  • Oracle
  • 回答数2
  • ありがとう数10

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

  • ベストアンサー
回答No.2

8i workgroup だと、分析関数が使えません。9i以降は、standard(旧workgroup)でも使えますが。以下、代替え法です。 ・個人番号毎に日付が単一(同一日なし)なのであれば、 select 個人番号,日付,名前,生年月日 from TARGET where (個人番号,日付) in (select 個人番号,max(日付) from TARGET group by 個人番号) ;

deny
質問者

お礼

回答ありがとうございます! データは個人番号と日付がキー項目なので、 同一日はありません。 ご回答いただいた方法で無事できました。 本当にありがとうございました。

その他の回答 (1)

回答No.1

オラクルのバージョンによって、最適なSQLが変わってくるので、 バージョンとエディションは書いておく方が良いと思いますよ。 分析関数による解決法 select 個人番号,日付,名前,生年月日 from ( select TARGET.*, row_number() over(partition by 個人番号 order by 日付 desc) R from TARGET ) where R=1 分析関数を使わない方法もありますが、面倒なので割愛。

deny
質問者

補足

回答ありがとうございます。 初めて質問させていただきましたので、 バージョン等の記述が抜けてしまいました。 失礼いたしました。 バージョンはoracle8iです。 すみません、初心者でエディションとはどこで 確認したらよいのか良く分かりません。 Oracle8iWorkgroupServer R8.1.7 for WindowsNT/2000 と書いてありました。 早速試してみたのですが、 ORA-00439: 機能は使用できません: OLAP Window Functions とエラーとなってしまいました。 バージョンの問題でしょうか? 本当にOracle初心者でよくわからず、すみません。 よろしくお願いいたします。

関連するQ&A

  • SQLServerでの複数テーブルからのデータ抽出

    皆様、お知恵を拝借させてください。 現在、SQLServer + VB.netで開発を行っていますが、どうしてもうまくいかないので悩んでいます。 ロジックを組めば解決できるのは、わかっているのですが、SQL文だけで解決したいのです。 よろしくお願いします。 やりたいことは、複数テーブルからの同一IDの抽出です。 IDで単一化 テーブル【現在】を優先して抽出 テーブル【履歴】のみ存在する場合、履歴NOの大きい方を抽出 テーブル【現在】  ID 名前 趣味 ------------------  10 太郎 釣り  20 次郎 ゴルフ テーブル【履歴】  ID 名前 趣味 履歴NO -------------------------  10 太郎 将棋 01  10 太郎 囲碁 02  30 花子 園芸 01  30 花子 料理 02 求めたい結果は 10 太郎 釣り 20 次郎 ゴルフ 30 花子 料理 です。よろしくお願いします。

  • Mysqlで最新の日付を持つデータを取得するSQLを書きたい

    Mysqlで最新の日付を持つデータを取得するSQLを書きたい 管理テーブル(MySql) 日 付|食べたもの ----------- 4月1日|パン 4月2日|ご飯 4月3日|パン 4月4日|パン 4月5日|ご飯 4月6日|カレー と言ったデータがあったとき パンを食べた最新の日付を取得したいとき どんなSQLを書けばいいのでしょうか? SELECT * FROM 管理テーブル WHERE 食べたもの = パン ORDER BY 日付 DESC LIMIT 1; とすれば、思うような結果が出ましたが LIMITは使いたくありません また 日 付|食べたもの ----------- 4月4日|パン 4月5日|ご飯 4月6日|カレー 上記のように 食べたのもそれぞれの最新の日付を表示して 一覧にしたいとき(表現ベタですみません) どんなSQLになりますか?

    • ベストアンサー
    • MySQL
  • 最新の日付と2番目の日付のデータ取得方法

    SQL Server 2008 にて下記条件を満たしたデータの取得を行いたいです。 ・IDごとに、日付がある日以前で最新のものとその次の日付のデータ2件 ・ただし、その2件で価格が変わらなければ価格変動のあった日付のデータまでさかのぼる ・価格が同じデータの場合、古い日付のデータを取得 例: ・条件…日付が20040101以前 <検索対象データ> ID  日付    価格 ------------------------ 1   20000101   100 1   20010201   100 1   20020301   200 2   20020401   300 2   20000501  400 2   20010601   400 2   20030701   300 3   20000801   500 3   20010901  600 3   20040901  600 <取得したい結果> ID  日付    価格 ------------------------ 1   20020301   200 1   20000101   100 2   20020401   300 2   20000501  400 3   20010901  600 3   20000801   500 なるべく少ないSelect文で取得したいと考えております。 よろしくお願いします。

  • Excel(マクロ?VBA?)で最大日付の行を抽出

    Excelのデータ抽出で困っております。 下記のようなデータがあり、各IDの最大日付の行を抽出しようとしていますが、抽出方法がわからず、困っています。  氏名  ID   日付   山田太郎 10 2012/12/01 山田太郎 10 2013/08/01 山田太郎 10 2014/12/01 山田太郎 10 2015/08/01 山田花子 20 2012/12/01 山田花子 20 2013/08/01 山田花子 20 2013/12/01 この際に、 山田太郎 10 2015/08/01 山田花子 20 2013/12/01 という2つの行を抽出したいですが、抽出方法がわかりません。 関数を使ってやろうとも思いましたが、関数をどれを使えばいいかわかりません。 別シートに抽出でも全く問題ありませんので、恐れ入りますが、抽出方法を教えてください。 よろしくお願いいたします。

  • 申込日から起算して1ヶ月経過しているデータのみ表示

    はじめまして。現在仕事でデータベースアプリを開発しているのですが、表題の件でちょっと頓いてしまっているので、皆様のお知恵を借りたく投稿させていただきます。 開発環境は下記で行っております。 ================================================================ OS:WindowsXP Professional SP3 アプリケーション:Access ADP(Access2007 + SQLServer2008 Express) SQLServer Management Studioを使用 ================================================================ あるサービスへの申込者一覧をビューにて作成したいと思っているのですが、例を挙げると下記のようなデータ ---------元データのテーブル------------- 申込日 氏名 2010/12/01 テスト太郎 2010/12/02 テスト三郎 2010/12/05 テスト次郎 2010/12/31 テスト三郎 2011/01/04 テスト次郎 2011/01/05 テスト次郎 2011/01/10 テスト太郎 2011/02/01 テスト太郎 2011/02/11 テスト太郎 2011/03/02 テスト太郎 -------------------------------------- をビューを用いて同じ人がビューに出力されている申し込みから起算して1ヶ月の期間内にまた申し込まれたレコードは表示しないようにしたいのです。再現したいのは下記の通りです。 ---------出力結果(ビュー)-------------- 申込日 氏名 2010/12/01 テスト太郎 2010/12/02 テスト三郎 2010/12/05 テスト次郎 2011/01/05 テスト次郎 2011/01/10 テスト太郎 2011/02/11 テスト太郎 ------------------------------------- ~~~~~~~~~~~元データをもとに解説~~~~~~~~~~~~~ 2010/12/01 テスト太郎 2010/12/02 テスト三郎 2010/12/05 テスト次郎 はお三方とも最初の申し込みなのでそのままビューに出力 2010/12/31 テスト三郎 2011/01/04 テスト次郎 はビューに出力されるレコードのデータの日付からそれぞれ1ヶ月経過していないので、 ビューには出さない 2011/01/05 テスト次郎 はビューに出力される 2010/12/05 テスト次郎 の日付 2010/12/05 より起算して1ヶ月以上経過しているのでビューに出力 2011/01/10 テスト太郎 はビューに出力される 2010/12/01 テスト太郎 の日付 2010/12/01 より起算して1ヶ月以上経過しているのでビューに出力・・・(1) 2011/02/01 テスト太郎 はビューに出力される(1)の 2011/01/10 テスト太郎 の日付 2011/01/10 より起算して1ヶ月経過していないのでビューに出力しない 2011/02/11 テスト太郎 はビューに出力される(1)の 2011/01/10 テスト太郎 の日付 2011/01/10 より起算して1ヶ月以上経過しているのでビューに出力・・・(2) 2011/03/02 テスト太郎 はビューに出力される(2)の 2011/02/11 テスト太郎 の日付 2011/02/11 より起算して1ヶ月経過していないのでビューに出力しない ---------元データのテーブル------------- (※ビューに出力は○、出力しないはX、番号は上記解説に対応) 申込日 氏名 2010/12/01 テスト太郎 ○ 2010/12/02 テスト三郎 ○ 2010/12/05 テスト次郎 ○ 2010/12/31 テスト三郎 X 2011/01/04 テスト次郎 X 2011/01/05 テスト次郎 ○ 2011/01/10 テスト太郎 ○・・・(1) 2011/02/01 テスト太郎 X 2011/02/11 テスト太郎 ○・・・(2) 2011/03/02 テスト太郎 X -------------------------------------- ※元データは申込受付テーブルなので、リアルタイムにお客様が申し込みされた日付でレコードは増えていきます ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ どのようなSQLにすればよろしいでしょうか...

  • 一覧の表示で名前をデータ数を表示したいのですが…

    お世話になります。 度々申し訳ないのですが、質問させてください。 現在mysqlに格納したデータの一覧を表示するページを作っているのですが、表示結果が思うようにいかず困っています。 環境:Mysql 5.1.22-rc,PHP  5.2.5 データベース:test01 main -------------------------------------------------------- id name kana 1 太郎 たろう 2 次郎 じろう 3 花子 はなこ -------------------------------------------------------- sub2 -------------------------------------------------------- id a_sakuhin   title 1 data_1   青空   1 data_2   夕日 1 data_3   流星   3 data_1   町並み 3 data_2   列車   -------------------------------------------------------- というテーブルがあります。 それを一覧表示で ・太郎 (3) ・次郎 (0) ・花子 (2) という具合にしたいのですが、どうしても()の中が全件合わせた結果になり ・太郎 (50) ・次郎 (50) ・花子 (50) という様になってしまうのです。 どういったsql文を書けばよいのかアドバイスを頂けると嬉しいです。 よろしくお願いいたします。

  • 最新データ取得

    いつもお世話になります。 Access 2007のコードを教えていただきたいです。 Access で社員単価管理を作成しています。 クエリで社員の単価を計算させて、日報フォームに表示させることができました。以下のコードで If Not IsNull(Me![個人ID]) Then Me![工数単価] = DLookup("日給", "Q_社員別給与最新日付", "[個人ID]=" & Me![個人ID]) End If 社員の単価は上がる場合がありますので、社員単価入力テーブルから最新の日付のデータを取得するため、クエリを作成しました。 これでうまく行くと思ったら、問題発生しております。 日報フォームのデータを修正する時、最新日付の単価も変わってしまいます。 うまく説明できないですので、以下のようです 社員単価入力テーブル 日付     個人ID 原価金額 20110401   01    6400 20110701   01    8000 日報フォーム 日付    個人ID 出勤時間 退勤時間 工数 残業 日給 20110630   01    8:00    18:00    1   1  7200   20110701   01    8:00    17:00    1   0  8000 データ修正後 日付     個人ID 出勤時間 退勤時間 工数 残業 日給 20110630   01    8:00    17:00    1   0   8000 データ修正後に表示してほしいのは 日付   個人ID 出勤時間 退勤時間 工数 残業 日給     20110630  01   8:00     17:00   1   0   6400 つまり、 社員単価入力テーブルの日付<日報フォームの日付なら、最新の日付のデータで計算してほしいです。そうではない場合、最新日付より前のデータで計算するというコードが書きたいですが、どういう風にに書けばいいか全く、わかりません 教えて下さい。 よろしくお願いします。

  • 集計するためのSQL構文を教えて下さい。

    初めて投稿します。よろしくお願いします。 現在、ストアドプロシージャとSQLの勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。 [環境]  データベース:SQLServer2005  SQL作成環境 :SQLServerManagementStudioExpress(9.00.2047.00) 望んでいる出力結果 病室,タイプ,10/01水,10/02木,10/03金,10/04土,10/05日 -------------------------------------------------------------- 10,集合3,○○太郎,○○太郎,○○太郎,○○太郎,□□花子        △△太郎,△△太郎,□□花子,□□花子        □□花子,□□花子 11,個室A,          ××太郎,××太郎,××太郎 12,個室B,     ○○次郎,○○次郎,○○次郎,○○次郎 ※指定した日付範囲で、全病室を対象に入院中患者、入院予定患者を  病室単位で求めたいです。 関係するテーブル情報 ※マスタテーブルは、名称+Mで表記します。 ※データテーブルは、名称+Tで表記します。 [病室] 病室M(  病室番号 INT  タイプコード INT ) [日付] ストアドのパラメータで集計開始日と終了日を受け取るため、 その集計範囲も動的に変わります。 ※上記の結果では、  集計日(自):2008/10/01  集計日(至):2008/10/05 を受け取った場合を想定し記述しています。 [入院者氏名] 患者T(  患者コード INT  患者氏名 VARCHAR(128)  通院種別 TINYINT(1:通院,2:入院)  退院区分 TINYINT(1:入院,2:退院)  入院日 SMALLDATETIME  退院日 SMALLDATETIME ) [患者と病室を紐付けるテーブル] 病室割当T(  割当番号 INT  患者番号 INT  病室番号 INT ) 長文となり申し訳ありません。 上記の情報でストアドを組もうとしているのですが、 SQL含め勉強不足な状態です。 実現するための考え方、方法、アドバイス等を頂きたいです。 よろしくお願い致します。

  • エクセルの集計での質問

    A列に日付、BからF列に担当者名(1~5)が入っています。 この表で誰が何日稼働したか調べたいのですが、日付の被りがあるのと、例えば▲▲さんが「担当者1」、●●さんが「担当者2」と決まっているわけでなく、早いもの順に「担当者1~5」までに名前が入っています。 A B C D E F 日 担1 担2 担3 担4 担5 1/3 太郎 次郎 花子 三郎 和子 1/3 次郎 太郎 三郎 美和 和子 1/4 花子 次郎 孝夫.......... この場合求められたものが 1/3 太郎 ×1、次郎 ×1、三郎×1、花子×1、和子×1 、美和×1 1/4 花子×1、次郎×1、孝夫×1 なので 太郎1日 次郎2日 三郎1日 花子2日 和子、美和、孝夫各1日 という風にエクセルで集計できないでしょうか?

  • oracle 最新日付との比較

    いま、同一商品番号の最新日付を利用した条件が うまく作れず悩みながら色々試していますが、 うまくいきません。 やりたいことは、 1,AテーブルとBテーブルの 商品番号が同じ場合は除外します。 2,残されたデータから次はCテーブルの中にある 同一商品番号で、最新の日付が当月の場合はデータを残す。 つまり、前月以前のデータは除外となります。 1まではできています。 Select * from aテーブル where not exists (select 'X' from bテーブル where a.商品番号 = b.商品番号) この先上記sqlにつなげてmax関数くくった最新日付と システム日付を年月のみで比較する等試みましたが、 求めた結果になりません。 上記sqlでビューを作成してといったことは、 今回やらずに一つのsqlのみでできないかと 試行錯誤です。 よきアドバイスございましたら、 宜しくお願い致します。