重複するキーから一番古い年月日のデータのみ取得する方法
- SQL文を使用して、重複するキーから一番古い年月日のデータのみを取得する方法について分からずに困っています。
- テストテーブルにはコード、枝番、年月日の3種類のデータがあり、同じコードの中で年月日が一番若いデータのみを取得したいです。
- 試しにSELECT文を書いてみたのですが、コードが同じで枝番が違うが年月日が同じデータも取得されてしまっています。どのようにすれば望んだ結果を得ることができるでしょうか。
- ベストアンサー
重複するキーから一番古い年月日のデータのみ取得したい
下記の事を実現する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
- temjin0126
- お礼率62% (10/16)
- PostgreSQL
- 回答数1
- ありがとう数3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
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 │ 優先しない
- ベストアンサー
- PostgreSQL
- 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文を教えてください。よろしくお願いします。
- 締切済み
- Oracle
- 2つのテーブルのデータまとめて取得したい
SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。
- ベストアンサー
- SQL Server
- 重複しているデータを取得したい
[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をどのように書けばよいのかがわかりません。 どなたかアドバイスを頂けないでしょうか? よろしくお願いいたします。
- ベストアンサー
- Oracle
- 重複データの集計方法を教えてください。
テーブル名:テスト コード 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がでればいいです。 よろしくお願いします。
- ベストアンサー
- SQL Server
- 重複レコードの抽出について
以下のようなテーブルから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文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。
- 締切済み
- その他(データベース)
- 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
- ベストアンサー
- SQL Server
- データベースからFOREIGN KEYの一覧を取得したい
初心者です。 SQL SERVER 2005で データベースで使用されている外部キーの一覧を取得したいのですが、 SELECT * FROM sys.objects WHERE type = 'F' や SELECT * FROM sys.foreign_keys では、実際にどのテーブル・どの項目が使用されているのかが取得できません。 どのようなSQL文を書いたらいいでしょうか? よろしくお願いします!
- ベストアンサー
- SQL Server
- 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は境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。
- ベストアンサー
- SQL Server
- 集合関数(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文でもかまわないので、 一度で持ってこれるような構文はないでしょうか? 宜しくお願いいたします。
- ベストアンサー
- Oracle
お礼
うおおお、要望通りの結果ができました! ちゃんと確認していないのですが、恐らく大丈夫そうです! 本当に助かりました! ありがとうございます!!