• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:優先順位を付けて重複するキーから一番古い年月日のデータのみ取得したい)

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

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

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

  • ベストアンサー
  • 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