• ベストアンサー
  • すぐに回答を!

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

下記の事を実現する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

共感・応援の気持ちを伝えよう!

  • PostgreSQL
  • 回答数1
  • 閲覧数1596
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.1
  • umota
  • ベストアンサー率46% (150/324)

PostgreSQL 8.3.7 で試してみました。 SELECT DISTINCT ON (コード) コード , 枝番 , 年月日 FROM テストテーブル WHERE (コード , 年月日) IN (SELECT コード , MIN(年月日) FROM テストテーブル GROUP BY コード ); でどうでしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

うおおお、要望通りの結果ができました! ちゃんと確認していないのですが、恐らく大丈夫そうです! 本当に助かりました! ありがとうございます!!

関連するQ&A

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

    以前こちらで 「重複するキーから一番古い年月日のデータのみ取得したい」 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 │ 優先しない

  • SQL 複数のテーブルから重複なしでデータを取得

    同じフィールド名[名前]を持つテーブルが複数個あります。 仮にテーブル名を、A、B、C、Dの4個だとします。 それらのテーブルから、フィールド名[名前]のデータを重複なしで取得したいのですが、SQL文が思いつきません。 取得するフィールドは[名前]だけです。 select distinct(名前) from A union select distinct(名前) from B union select distinct(名前) from C union select distinct(名前) from D だと、各表に同じ名前が存在する場合は結果も重複してしまい、期待する結果が得られませんでした。 環境はOracle 9iです。 SQL文を教えてください。よろしくお願いします。

  • 2つのテーブルのデータまとめて取得したい

    SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。

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

    [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をどのように書けばよいのかがわかりません。 どなたかアドバイスを頂けないでしょうか? よろしくお願いいたします。

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

    テーブル名:テスト コード 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がでればいいです。 よろしくお願いします。

  • 1回のSELECT文でデータを取得したい

    1テーブル(V_TEST)より日付(CTR_M)を抽出条件(単年月、複数年月)で、 金額(COSTM_GR)をそれぞれ合算した結果を表示したい 以下のSELECT文に合算処理を入れて完成するのですが、わかりません。 具体的な方法をご教授ください。 ※1回のSELECT文でデータを取得したい (以下にSQL文、テーブル内容、処理結果を明記します) 使用ソフト:SQL Server2000 ・SQL文 SELECT SECTN_C, TK = CASE WHEN CTR_M = '2005/06/01' THEN COSTM_GR ELSE 0 END, COSTM_GR AS TR FROM V_TEST WHERE CTR_M = '2005/06/01' OR CTR_M = '2005/04/01' ・V_TEST テーブル CTR_M SECTN_C COSTM_GR 2005/03/01 1 10000 2005/04/01 1 1 2005/04/01 1 2 2005/04/01 1 3 2005/04/01 1 4 2005/04/01 1 105 2005/04/01 1 12345678901 2005/06/01 2 100000 2005/06/01 1 1005 ・処理結果 SECTN_C TK TR 1 0 1 1 0 2 1 0 3 1 0 4 1 0 105 1 0 12345678901 2 100000 100000 1 1005 1005

  • 重複レコードの抽出について

    以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。 mail | name ----------- aaa | 01 aaa | 01 aaa | 01 bbb | 02 bbb | 02 bbb | 01 ccc | 01 ccc | 01 ccc | 02 select * from test where mail in (select mail from test where mail group by mail having count(mail)>1) 上記のSQL文だと以下のデータが取得されてしまいます。 ↓ mail | name ----------- aaa | 01 ○ aaa | 01 ○ aaa | 01 ○ bbb | 02 × bbb | 02 × ccc | 01 × ccc | 01 × ○印のみ取得したいのですが、 SQL文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。

  • データベースからFOREIGN KEYの一覧を取得したい

    初心者です。 SQL SERVER 2005で データベースで使用されている外部キーの一覧を取得したいのですが、 SELECT * FROM sys.objects WHERE type = 'F' や SELECT * FROM sys.foreign_keys では、実際にどのテーブル・どの項目が使用されているのかが取得できません。 どのようなSQL文を書いたらいいでしょうか? よろしくお願いします!

  • betweenで境界値が取得できない。

    連番の歯抜け値を取得するSQLを作りたいと思っています。 例えば、カラムAに、1,2,3,5,6,7,9,10(4と8が抜けている) と数値の入っているテーブルAがあるとします。 これに対して、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) とSQLを投げた場合、4が取得できます。 これにbetween句を付与したいのですが、そうすると境界値が なぜか取れなくて困ってます。 具体的には、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) AND BETWEEN 8 AND 10 とした場合、NULLが返ってきてしまいます。 普通、BETWEENは境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。

  • 集合関数(MIN)で取得した値をキーする場合

    SQLの構文でご教授願います。 テーブル1(顧客マスタ) 顧客番号  住所コード 1        01 1        02 1        03 テーブル2(住所マスタ) 住所コード 住所 01       ううう 02       いいい 03       あああ 上記2テーブルを連結し、 「顧客番号」と「同一顧客内の最小の住所コード」と「その住所コードの住所」を取得したいのですが、、、 SELECT 顧客マスタ.顧客番号,MIN(住所マスタ.住所コード) AS 住所コード,MIN(住所マスタ.住所) AS 住所 FROM 顧客マスタ INNER JOIN 住所マスタ ON 顧客マスタ.住所コード = 住所マスタ.住所コード GROUP BY 顧客マスタ.顧客番号; と発行すると、 顧客番号  住所コード 住所 1        01      あああ となってしまいます。 これを、 顧客番号  住所コード 住所 1        01      ううう のように取得したいのですが、 どのようなSQL文を書けばよいのでしょうか。 ちなみに、VIEWは使いたくなく、複雑なSQL文でもかまわないので、 一度で持ってこれるような構文はないでしょうか? 宜しくお願いいたします。