[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

このQ&Aのポイント
  • SQLを使用して、重複する内容を持つデータから1件抽出し、複数のカラムを表示したい場合、select distinct(ID), TAG from Aのようなクエリを使用することができます。
  • このクエリを使用すると、ID列が重複しない結果が表示され、かつTAG列も表示されます。結果としては、重複しないIDとその対応するTAGが表示されることになります。
  • ただし、テーブルAのデータによっては、上記の結果とは異なる結果が得られることもあります。重複していないIDと対応するTAGを表示させたい場合は、データの内容に合わせて適切なクエリを使用する必要があります。
回答を見る
  • ベストアンサー

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい 初めてお世話になります。 データベース種別はH2です。 参考:http://www.h2database.com/html/main.html 下記のようなテーブルAがあるとします。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   1   |  def   |   1   |  ghi   |   2   |  abc   |   2   |  ghi   |   3   |  abc   |   3   |  def   |   3   |  ghi   |   4   |  abc   | 上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   2   |  abc   |   3   |  abc   |   4   |  abc   | 上記結果でなくとも、   ID  |  TAG  | ―――――+―――――|   1   |  def   |   2   |  ghi   |   3   |  def   |   4   |  abc   | であっても構いません。(TAG列のデータはどんな内容でもよいです。) 実現させたいのは、 (1)ID列が重複しない結果を表示させたい、 かつ (2)TAG列も表示させたい ということです。 これでイケるだろ!と思ってあえなく失敗したSQLは下記です; select distinct(ID), TAG from A 宜しくお願い致します。

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

H2を知らないケド。Oracleだったら。 select ID, MIN(TAG) from A GROUP BY ID ORDER BY ID ではどうでしょう? select ID, MAX(TAG) from A GROUP BY ID ORDER BY ID もお試しください。

trum1979
質問者

お礼

あ、ありがとうございます!!! 希望した結果が得られました!

関連するQ&A

  • SQL2005 で 複数列でのユニークの仕方

    SQL Server2005 Expressを使っているのですが。 下記のような3列の項目からなるテーブルがあり、ABCはそれぞれ数字として。 No1,No2,No3 A, B, A, F, B, C, B, F, B, , C, E, F 数字をユニークし、結果を A,B,C,E,F としたいのですが。 列(No1)だけでのユニークでよいなら Select Distinct(No1) ・・・・・ と書けばよいのでしょうが。 現在は、各列でユニークし、配列にいれて重複は削除するやり方をしているのですが。 この例では3列ですが実際は5列以上あります。 SQLでスマートなやり方はないでしょうか?

  • 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文を教えてください。よろしくお願いします。

  • SQL最大値レコード抽出について

    下記のようなテーブルがあったとしてフィールド1のコードごとにフィールド2が最大値のものを抽出したいのですが一回のSQLで可能ですか? フィールド1 フィールド2 abc 20070309 abc 20070302 abc 20070307 def 20070304 def 20070306 def 20070303 ・ ・ ・ 例: abc 20070309 def 20070306 ・ ・

    • ベストアンサー
    • MySQL
  • excelの重複データの削除方法。

    excel2003で重複する値を自動的に削除する方法を探しています。 現在、以下のような手順で作業をしています。     A   B   C 1 ○○○ 100 ABC 2 ▼▼▼ 200 DEF 3 ◇◇◇ 300 GHI 4 ■■■ 400 JKL 5 △△△ 500 MNO ↑の元データに      A   B   C 1 ○○● 100 ABC 2 ◇◆◇ 300 GHI ↑のデータを追加(貼り付け)して並び替えをすると      A   B   C 1 ○○○ 100 ABC 2 ○○● 100 ABC 3 ▼▼▼ 200 DEF 4 ◇◇◇ 300 GHI 5 ◇◆◇ 300 GHI 6 ■■■ 400 JKL 7 △△△ 500 MNO というデータが出来るとします。 「C列の値を基準」として、重複している箇所を検出・削除し (上の例で言えば、1・2・4・5の行。)      A   B   C 1 ▼▼▼ 200 DEF 2 ■■■ 400 JKL 3 △△△ 500 MNO というデータにしたいと考えております。 重複した値のどちらか一方を残す、という方法ではなく、 重複した値の全てを削除する、という方法が解りません。 手作業で1つ1つ削除していけばいいのですが、本物のデータは何千件とあるので 手作業では時間が掛かりすぎてしまいますので…。なにかよい方法はないでしょうか? 簡単な方法であれば大変助かりますが、マクロなどを使用する方法でもかまいませんのでご教授下さい。 よろしくお願い致します。

  • 重複していないレコードの抽出方法について

    下記のテーブルの中で、 no1 フィールドが重複していない列(この場合ですが、200003のみ)を抽出したいのですが、どのような sql 文を書けば良いか分かりませんでした。 その為、このような場合、どのような sql 文を書けば良いかご存知の方がいらっしゃいましたら、 ご教示の程、よろしくお願いします。 【w_tblテーブル】 ―――――――――― |key| no1 |no2| ―――――――――― |1 |200001|1 | |2 |200002|1 | |3 |200001|2 | |4 |200002|2 | |5 |200001|3 | |6 |200003|2 | ―――――――――― 【SQL文】 SELECT `no1` FROM `w_tbl` 【結果】 200001 200001 200001 200002 200002 200003 【SQL文】 SELECT DISTINCT `no1` FROM `w_tbl` 【結果】 200001 200002 200003 【SQL文】 ※※※ここの書き方が分かりません。※※※ 【結果】 200003 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • あるカラムの値を複数持つレコード以外を抽出したい

    下記のようなレコードを持つテーブル(仮にtest1)があります。 ID price type 001 2000 1 001 4000 1 002 8000 2 003 2000 1 003 8000 2 004 5000 3 ここから次の条件で抽出したいのですがSQLに明るくないためよくわかりません。 ・typeが1と2の両方を持つもの、または、3を持つものを除く ・その上でpriceの合計値をIDごとに得たい 求める結果としては、 ID price 001 6000 002 8000 を得たいのですが。 distinctを使う必要があるというぐらいしか分かっていません。 よろしくお願いします。

  • 複数のシートから検索抽出

    検索値シート(4)【B】123で行い、検索範囲をシート(1)、(2)、(3)のうちの一つの【B】列でヒットした【A】列ABCをシート(4)の【C】に検索結果を表示させたいのですがどのようにしたらよいでしょうか。 また、シート(4)【B】列1000以上全て検索値としたいのですが、どうかよろしくお願いします。 シート(1)~(3) 【A】  【B】  【C】 ABC ....123 DEF ...456 GHI ....789 JKL ....795 MNO ..816 シート(4) 【A】 【B】 【C】    .. 123 ... ??? ......... 456 ......... 789 方法が分からず困っています。 お手数ですが、どうかお教えください。

  • SQLで複数列のデータを複数行にしたい

    以下のようなテーブルがあるとします。 column1 a,b,c <- カンマの数は最大50 b,d c,x SQLを実行し以下のような結果を返したいです。 以下の3つのことをすればできそうなのですが複数列を複数行にする方法がわかりません。 1.strtokenで50カラムに分割(カンマ分割) 2. 50カラムを1カラムにする 3.DISTINCTで重複データの削除 結果 a b c d x カンマの数が50あるので、かなり長いSQLになるのですが SELECT文50個をUNIONしてやればできるかなとも考えているのですが 何か良い方法はないでしょうか。 よろしくお願いします。

  • SQLで重複値を除去したものを抽出したい

    SQLで重複を除去したいのですが、DISTINCTやGROUP BYも検討したのですが、どうしても良い方法が見つからなかったので質問させて頂きます。 テーブルの構成は以下のようになっています。 roomsテーブル id(INTEGER) public(BOOLEAN) updated_at(DATETIME) created_at(DATETIME) messagesテーブル id(INTEGER) sendfrom_list_id(INTEGER) sendto_list_id(INTEGER) room_id(INTEGER)※roomsテーブルへの外部キー body(STRING) updated_at(DATETIME) created_at(DATETIME) 更に条件は以下のようになっています。 ・アウトプットとして得たいのは rooms.updated_at rooms.id rooms.public messages.room_id messages.sendfrom_list_id messages.sendto_list_id messagess.body の7カラム。 ・rooms.publicがTRUEである ・messages.room_id = rooms.idであること ・updated_atでDESCにソート このような条件を満たすSQL文は以下のように書くことができました。 SELECT R.updated_at, R.id, R.public, M.room_id, M.sendfrom_list_id, M.sendto_list_id, M.body FROM messages AS M, rooms AS R WHERE R.public = "t" AND M.room_id = R.id ORDER BY R.updated_at DESC; しかし、ここに更に「rooms.idが重複しないもののみ抽出」という条件を加えたいのですが、どうしてもうまく行きません。 DISTINCTでは複数の中から一部のカラムだけをDISTINCTすることはできないようですし、GROUP BYも考えましたがどうやれば良いかわかりませんでした。 どなたか良い方法を教えて下さい。

  • VLOOKUPのような検索で複数ヒットしたら全て抽出したい

    VLOOKUPで検索すると検索値シート(2)【B】123で行い、検索範囲をシート(1)【B】列、ヒットした左列ABCをシート(2)の【C】に表示するが一般的てきですが、検索範囲シート(1)【B】列で1000種類ある中で123が3個、456が4個その後も重複がつづき、更にヒットした左列が全て違っていたらどのようにして、シート(2)【C】に検索結果全て表示させたらよいでしょうか。 また、シート(2)【B】列1000以上全て検索値としたいのですが、どうかよろしくお願いします。 シート(1) 【A】  【B】  【C】 ABC ....123 DEF ...456 GHI ....123 JKL ....456 MNO ..789 シート(2) 【A】 【B】 【C】    .. 123 ... ??? ......... 456 ......... 789 方法が分からず困っています。 お手数ですが、どうかお教えください。