優先順位を付けて重複するキーから一番古い年月日のデータのみ取得する方法

このQ&Aのポイント
  • 優先順位を付けて重複するキーから一番古い年月日のデータのみ取得する方法について教えてください。
  • テストテーブルにはコード、枝番、年月日、優先の4種類のデータがあり、重複するキーから一番古い年月日のデータのみを取得したいです。
  • 同じコードの中で「優先」が「優先する」のデータで一番古い年月日のデータを優先的に取得し、優先がない場合は一番古いデータを取得したいです。Postgresのバージョンは8.0.3です。
回答を見る
  • ベストアンサー

優先順位を付けて重複するキーから一番古い年月日のデータのみ取得したい

以前こちらで 「重複するキーから一番古い年月日のデータのみ取得したい」 http://oshiete1.goo.ne.jp/qa4857546.html と言う質問をさせて頂きました。 その内容に追加で質問があります。 テストテーブルにはコード、枝番、年月日、優先の4種類のデータがあります。 テストテーブルはコードと枝番を主キーとします。 1つのコードに対して、重複しない枝番が複数登録可能となっています。 取得するデータはコード、枝番、年月日、優先の4種類のデータを取得し、 更に今回は同じコードの中で「優先」が「優先する」のデータで一番古い年月日のデータを優先的に取得する。 同じコードの中で「優先」の「優先する」がなければ(全て「優先しない」の場合)、その中から一番古いデータを優先的に取得したい。 上記の内容のデータを取得したいのですが、今回ばかりは全くSQL文が思い浮かびません・・・・ 自分の力量不足なのは重々承知しております。 ヒントでも何でも構いませんので、ご回答ご教授の程お願い致します。 Postgresのバージョンは8.0.3で試しております。 ■テストテーブルのデータ コード │ 枝番 │ 年月日 │ 優先 ----------------------------- 1 │ 1 │ 2009-01-01 │ 優先しない 1 │ 2 │ 2009-01-03 │ 優先する 2 │ 1 │ 2009-02-15 │ 優先する 2 │ 2 │ 2009-02-10 │ 優先する 2 │ 3 │ 2009-02-20 │ 優先する 3 │ 1 │ 2009-03-15 │ 優先しない 3 │ 2 │ 2009-03-10 │ 優先しない 3 │ 3 │ 2009-03-05 │ 優先しない 3 │ 4 │ 2009-03-01 │ 優先しない ↓↓↓ ■望んでいる取得結果 コード │ 枝番 │ 年月日 │ 優先 ----------------------------- 1 │ 1 │ 2009-01-03 │ 優先する 2 │ 2 │ 2009-02-10 │ 優先する 3 │ 4 │ 2009-03-01 │ 優先しない

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

  • ベストアンサー
  • qbr2
  • ベストアンサー率50% (62/123)
回答No.3

No2ですが、以前の質問の回答を利用すると、これで 同一コードで日付が重複していても問題なさそうですね。 こんなことできるのか。。。勉強になった。 SELECT DISTINCT ON (コード) コード , 枝番 , 年月日 FROM テーブル WHERE (コード , 年月日) IN (SELECT COALESCE(A.コード,B.コード) AS コード, COALESCE(A.年月日,B.年月日) AS 年月日 FROM (SELECT コード,MIN(年月日) AS 年月日 FROM テーブル WHERE 優先='優先する' GROUP BY コード) AS A FULL OUTER JOIN (SELECT コード,MIN(年月日) AS 年月日 FROM テーブル WHERE 優先='優先しない' GROUP BY コード) AS B ON A.コード=B.コード )

temjin0126
質問者

お礼

お礼が遅くなり申し訳ございません。 ご回答有難うございます。 上記のSQLで意図している内容を取得する事が出来ました。 非常に勉強になりました。 まだまだSQLの勉強をしなければいけないと思いました・・・・

その他の回答 (2)

  • qbr2
  • ベストアンサー率50% (62/123)
回答No.2

こんな感じでどうでしょう? 同一コードでの年月日は重複しないのが前提条件です。 SELECT C.* FROM テーブル AS C INNER JOIN ( SELECT COALESCE(A.コード,B.コード) AS コード, COALESCE(A.年月日,B.年月日) AS 年月日 FROM (SELECT コード,MIN(年月日) AS 年月日 FROM テーブル WHERE 優先='優先する' GROUP BY コード) AS A FULL OUTER JOIN (SELECT コード,MIN(年月日) AS 年月日 FROM テーブル WHERE 優先='優先しない' GROUP BY コード) AS B ON A.コード=B.コード ) AS D ON C.コード=D.コード AND C.年月日=D.年月日

  • yamada404
  • ベストアンサー率56% (9/16)
回答No.1

こんなのしか思いつかないです。 あまり良いクエリでは無いですが。。 SELECT * FROM テストテーブル A WHERE A. 年月日 = ( SELECT MIN(B. 年月日) FROM テストテーブル B WHERE A. コード = B. コード AND B. 優先 = '優先する' ) OR A. 年月日 = ( SELECT MIN(C. 年月日) FROM テストテーブル C WHERE A. コード = C. コード AND NOT EXISTS ( SELECT * FROM テストテーブル D WHERE D. 優先 = '優先する' AND C. コード = D. コード ) )

temjin0126
質問者

お礼

お礼が遅くなり申し訳ございません。 意図しているデータは取得できませんでしたが、 考え方としては参考になりました。 ご回答有難うございます。

関連するQ&A

  • 重複するキーから一番古い年月日のデータのみ取得したい

    下記の事を実現するSQL文がどうしても分からず困り果てています。。。。 ご回答の程お願い致します。 テストテーブルにはコード、枝番、年月日の3種類のデータがあります。 テストテーブルはコードと枝番を主キーとします。 1つのコードに対して、重複しない枝番が複数登録可能となっています。 取得するデータはコード、枝番、年月日の3種類のデータを取得し、同じコードの中で年月日が一番若いデータのみ取得したいです。 同じような質問で http://okwave.jp/qa4089797.html と言うURLの回答を参考に SELECT コード , 枝番 , 年月日 FROM テストテーブル where (コード , 年月日) in (SELECT コード , MIN(年月日) FROM テストテーブル GROUP BY コード ); というSQL文を考えたのですが、 コードは同じで枝番は違うが年月日が同じデータがあると 望んでいない結果にならず、困り果てています・・・・ ■テストテーブルのデータ コード │ 枝番 │ 年月日 ----------------------------- 1 │ 1 │ 2009-01-01 1 │ 2 │ 2009-01-03 2 │ 1 │ 2009-02-15 2 │ 2 │ 2009-02-10 2 │ 3 │ 2009-02-20 3 │ 1 │ 2009-03-15 3 │ 2 │ 2009-03-10 3 │ 3 │ 2009-03-05 3 │ 4 │ 2009-03-01 ↓↓↓ ■望んでいる取得結果 コード │ 枝番 │ 年月日 ----------------------------- 1 │ 1 │ 2009-01-01 2 │ 2 │ 2009-02-10 3 │ 4 │ 2009-03-01

  • 重複データの整理

    アクセス2000を使用。毎日データを分析して抽出されたデータを累積テーブルに追加して蓄積していますが、その日々の抽出されたデータにデータが重複してる場合があります。(これは2種類のコード{日付と企業コード}を重複キーとしているためとおもわれる) 累積された蓄積テーブルから同一日における重複コードを削除する方法を 教えてください。  日付は 20070907、20070908の形式  コードは4桁の整数   例示 20070901  1 20070901  2 20070901  2・・・(消す) 20070901  3 20070901  3・・・(消す)     20070901  4 よろしくお願いします

  • ACCESS 重複データに枝番を振りたいのですが

    ACCESS2000を使っています。超初心者です。 製品の修理受付管理DBから再修理のみを抽出したいのですが、DBには再修理のフラグが無いために、製造番号の重複を取り出し、それに枝番を振ることで、枝番2以上のデータを再修理受付として管理したいと考えています。しかし重複データのみを重複クエリで抽出するところまではできたのですが、そのデータへの枝番の振り方がわかりません。 《例》 こんなテーブルがあります。 受付番号 製品名 製造番号 修理内容 AAA  テレビ(1)  111  あああ BBB  テレビ(2)  222  いいい CCC  テレビ(3)  333  ううう DDD  テレビ(1)  111  えええ EEE  テレビ(2)  222  おおお FFF  テレビ(1)  111  かかか このテーブルをこんな感じに抽出して枝番フィールドを追加したいです。 受付番号 製品名 製造番号 枝番 修理内容 AAA  テレビ(1)  111  1  あああ DDD  テレビ(1)  111  2  えええ FFF  テレビ(1)  111  3  かかか BBB  テレビ(2)  222  1  いいい EEE  テレビ(2)  222  2  おおお 以上です。 ご教授のほどよろしくお願いします。

  • 重複データの集計方法を教えてください。

    テーブル名:テスト コード SEQ 0001  1 0001  2 0001  3 0002  1 0002  2 0002  3 0003  1 0003  2 0003  3 0003  4 0003  5 0003  6 0003  7 0003  8 0004  1 0004  2 0005  1 0005  2 0005  3 0005  4 0005  5 0005  6 0005  7 0005  8 0006  1 0006  2 0007  1 0007  2 こういったデータのテーブルがあります。 そこで、「コード」の重複件数が6件以下の データを集計したいのです。 これで、重複したコードの件数がでると思うのですが、 SELECT COUNT(コード) FROM テスト GROUP BY コード こういうイメージです。 3 3 8 2 8 2 2 6より多いデータは、6にして、それ以外のデータはそのままの値にしたいのです。 CASE WHEN aa > 6 THEN '6' ELSE aa END 上で書いたSELECTの結果を上記のCASEで使いたいのですが、 どのように記述すればよいのでしょうか? 下記のようにしてもうまくいきませんでした。 SELECT CASE WHEN aa > 6 THEN '6' ELSE aa END FROM (SELECT COUNT(コード) FROM テスト GROUP BY コード) as aa 最終的には、 3 3 6 2 6 2 2 となったものの合計を出したいです。 24がでればいいです。 よろしくお願いします。

  • 重複しているデータを取得したい

    [TBL_TEMP] ID 年月1  年月2 項目A  項目B -------------------------------------------- 1 200909 200910 aaaa bbbb 2 200807 200809 aaaa bbbb 3 200909 200910 aaaa bbbb 4 200909 200909 aaaa bbbb 5 200807 200809 aaaa bbbb 上記のようなデータがあり、年月1と年月2でグルーピングして、重複しているデータを抽出する場合は、以下のSQLでデータを取得できます。 SELECT MIN(ID),年月1,年月2 FROM TBL_TEMP GROUP BY 年月1,年月2 HAVING COUNT(1) >= 2 上記のSQLの場合、重複データの中でIDが一番小さいもののみが取得されるため、ID=1、2の2データが取得できます。 これを重複データ全件、つまり、ID=1,2,3,5のデータを取得するには、SQLをどのように書けばよいのかがわかりません。 どなたかアドバイスを頂けないでしょうか? よろしくお願いいたします。

  • 複数のテーブルからのデータ取得と連結

    いつもお世話になっております。 JavaでDBからデータを取得するプログラムを作成中です。 単純なものは問題無いのですが、 複数のテーブルからデータを取得し、そのデータを連結させるプログラムを作りたいのですがわからず困っています。 テーブル1 コードA(Key)       名称A テーブル2 コードB(Key)       名称B テーブル3 コードA(Key)       コードB(Key)       コードC(Key)       名称C となっており、取得したデータを 名称A+名称B+名称C と表示したいのですが、どのような処理を行えばよいのでしょうか? ちなみに複数のレコードを操作するプログラムも作ったことが無いレベルです。 どなたかご教授お願いします。

    • ベストアンサー
    • Java
  • 重複データを除いてインポート

    ACCESS2000を使用しています。 FDのデータをテーブルにインポートしたいのですが、重複しているデータはインポートしたくありません。 キーとなるものは、「個人コード」と「入力日」です。 同じ個人コードでも入力日が違えば別データとしてインポートしたいと思います。 アドバイスの程よろしくお願いします。 ※VBAを使って処理をするつもりです。 複数回の手順で行う方法でもよいので、良い方法があれば教えて下さい。

  • カーソルでのデータ取得

    いつもお世話になっております。 カーソルをオープンしたあとに(閉じる前に)、 カーソルのデータ取得元テーブルのデータが変化しても問題ありませんよね? ロジック的には。。。 OPEN カーソル カーソルデータ取得元テーブルのトランケート カーソルデータを1件ずつ編集し、データ取得元テーブルにINSERT CLOSE カーソル って感じなんですが。 キー重複などの関係で、一度テーブルを初期化した後に、もともとそのテーブルから取得したデータを編集し、INSERTしたいんです。 カーソルはOPENした時点の値を持ち続けるんですよね? 質問がわかりにくくてすみません

  • SQLで取得可能でしょうか

    SQLで取得可能でしょうか 今2つのテーブルがあるとします。 ---------------------- テーブル1  KEY    項目   1   テスト1   2   テスト2   3   テスト3 ----------------------- ---------------------- テーブル2   CD  名称    1   か   1   き   2   さ   2   し   2   す   3   た ----------------------- テーブル1のKEYはキーで重複しません。 テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。 今、テーブル1のKEY1件につき、データを1件取得したいのですが、 テーブル2の名称も取得したいです。 データは1件しか取得しない為、名称は、特定文字(例として/)で 区切って取得したいです。 期待したい結果 ----------------------  KEY  名称   1  か/き   2  さ/し/す   3  た ---------------------- このような取得は可能でしょうか? 尚、SQLの発行は1回のみで行いたいです。 よろしくお願いします。

  • 重複データの削除

    お世話になります。 現在、仕事でお客様のデータ(5万件くらい)を扱っています。 しかしデータをエクセルに取り込むシステムに難があり、同じお客様のデータを重複して取り込んでしまうことがあります。 そこで質問ですが、約5万件あるデータの中から効率よく重複データを削除する方法はありますか? 懸念事項は、同姓同名の方は削除してはいけないという点です。 データ項目は「名前」「住所」「生年月日」「性別」とあるので、 同姓同名でも生年月日や住所で判定することができます。 ちなみに私の考えは、 A列に名前、B列に生年月日とすると・・・ 1)ソート:優先順位はA列⇒B列 2)C列にIF(A1=A2,"重複","OK")として行方向へコピー   D列にIF(B1=B2,"重複","OK")として行方向へコピー   E列にIF(AND(IF(C1="重複",D1="重複")=TRUE,"重複","OK")として行方向へコピー 3)E列で"重複"でフィルタリングし、フィルタされた行の削除 スマートではないですが、私の知識では精一杯です。 何かスマートな方法はないものでしょうか? よろしくお願いいたします。