• ベストアンサー

SELECT文で最大値を抽出

(samp_tv) c-id | s-di | name1 | name2 ---------------------------- 1 | 100 | A | A 1 | 101 | B | D 1 | 102 | C | F 2 | 103 | D | E 2 | 104 | E | J 2 | 105 | F | K (samp_dic) id | c-num | word -------------------- 1 | 11 | A 1 | 11 | B 1 | 11 | C 2 | 12 | D 2 | 12 | E 2 | 12 | F 3 | 13 | G 行いたい動作は、samp_tv.name1とname2にsamp_dic.wordが存在し、最もwordが存在するs-idとc-numをSELECTで抽出したいです。 SELECT s-id,c-num FROM samp_tv,samp_dic WHERE c-id=s-id AND (name1 LIKE '%'||word||'%' OR name2 LIKE '%'||word||'%'); 上記のSQLでは、nameに存在する全てのs-idとc-numが出てきます。 s-idごとに最も出現数の高いc-numを抽出するにはどうしたらいいのでしょうか? よろしくお願い致します。

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

  • ベストアンサー
回答No.3

select a.code,a.sid, (select id from (select y.code,y.sid,x.id, (select count(*) from samp_dic as z where z.num=y.code and z.id=x.id and y.t1 like '%'||z.word||'%') + (select count(*) from samp_dic as z where z.num=y.code and z.id=x.id and y.t2 like '%'||z.word||'%') as Tx from (select distinct num,id from samp_dic) as x,samp_tv as y order by 1,2,4 desc) as b where a.code=b.code and a.sid=b.sid limit 1) as "どうだろ?" from samp_tv as a 効率は度外視して、こんな感じで、一文で書ける。 (少なくとも、ver7.2.1では動いてる)

その他の回答 (2)

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

ひとつのSELECT文では無理(っぽい)。 Oracleでいうビュー、ACCESSでいうクエリはPostgresSQLではなんと表現するのかな?4つになりましたぞ。 まとめようもあろうが、とりあえず回答します。 (ACCESSで作成・試験しました) 1.T1、またはT2にWORDを含むものを検出。 2.1.をS-ID別ID別にグループ化し、件数を集計。 3.2.をS-ID別にグループ化し最大件数を集計。 4.2.の「件数」が3.の「最大件数」であるS-IDとIDを表示。 の4つです。 結果は以下の通り。124は「最大」が共に2件なので表示されます。 s-id|id -------------- 123 | 1001 124 | 1001 124 | 1002 125 | 1002 ACCESSのクエリのまま貼り付けます。適宜修正してください。 1.qry(1)対象データ SELECT samp_dic.num, samp_dic.id, samp_dic.word, samp_tv.code, samp_tv.[s-id], samp_tv.t1, samp_tv.t2 FROM samp_dic INNER JOIN samp_tv ON samp_dic.num = samp_tv.code WHERE (((samp_tv.t1) Like ('*' & [word] & '*'))) OR (((samp_tv.t2) Like ('*' & [word] & '*'))); 2.qry(2)S-ID別ID別件数 SELECT qry(1)対象データ.[s-id], qry(1)対象データ.id, Count(qry(1)対象データ.id) AS idのカウント FROM qry(1)対象データ GROUP BY qry(1)対象データ.[s-id], qry(1)対象データ.id; 3.qry(3)最大件数 SELECT [qry(2)S-ID別ID別件数].[s-id], Max([qry(2)S-ID別ID別件数].idのカウント) AS idのカウントの最大 FROM [qry(2)S-ID別ID別件数] GROUP BY [qry(2)S-ID別ID別件数].[s-id]; 4.qry(4)結果データ SELECT [qry(2)S-ID別ID別件数].[s-id], [qry(2)S-ID別ID別件数].[id] FROM [qry(2)S-ID別ID別件数] WHERE [qry(2)S-ID別ID別件数].[idのカウント] in ( SELECT [qry(3)最大件数].[idのカウントの最大] FROM qry(3)最大件数 where [qry(2)S-ID別ID別件数].[s-id]=[qry(3)最大件数].[s-id] );

the-ai
質問者

補足

大変助かりました。補足ですが、 結果データ s-id|id -------------- 123 | 1001 124 | 1001 124 | 1002 125 | 1002 で s-id(124)は2件存在しますが、 1件だけにしたい場合は、 4.qry(4)結果データのSQL分にどのような文を 追加したら良いのでしょうか? よろしくお願い致します。

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

2つのテーブルの関連付けの定義が明確で無いようですが? 上記の例から、どのような結果を得たいのか、を補足ください。

the-ai
質問者

補足

すみません。例が悪いですね。 (samp_tv) code | s-id | t1 | t2 ----------------------- 10 | 123 |世界の不思議 |グルメ・秘境の旅 10 | 124 |旅行宿巡り  |世界のグルメ料理 10 | 125 |食する    |世界の美味しい料理 10 | 126 |  :    |   : 11 | 127 |  :    |   : 11 | 128 |  :    |   : (samp_dic) num | id | word ------------------- 10 | 1001 | 世界 10 | 1001 | 秘境 10 | 1001 | 旅行 10 | 1002 | グルメ 10 | 1002 | 美味 10 | 1002 | 料理 上記のテーブルより 各s-idに対して、t1/t2にwordの出現回数が多い、 idを取得したいです。 上記では、s-id(123)の場合、t1とt2には、 世界・秘境(id=1001)とグルメ(id=1002)が存在しますが、id=1001のグループのwordの方が2回出現しているので、 out_num | out_id ------------------- 123 | 1001 124 | 1002 : | : : | : SELECT s_id , id FROM samp_tv,samp_dic WHERE code=num AND (t1 LIKE'%'||word||'%' OR t2 LIKE '%'||word||'%'); 上記のSQLでは、t1とt2に出現する単語数分s_idとidが出力されます。 必要なデータはs-idと最も単語が出現したidです。 よろしくお願い致します。

関連するQ&A

  • likeの使い方について

    すみません。教えてください。。 ACCESSで下記2つのテーブルをunionでくっつけて nameの右端(1桁目)が同一のもの(CとCCなど)を抽出するため 下記のような構文を構築したのですが抽出されません。。 お手数ですがこちら何が原因となっているか教えていただけないでしょうか。。 よろしくお願い致します。 id name id name 1 a 1 a 2 b 2 b 3 c 3 cc 4 d 5 ee 5 e select * from (select * from tb1 union select * from tb2) as A where name like '*c' or name like '*d' or name like '*e'

  • 1文で最大値を求める方法

    テーブル(buf1) g_num ------ 11 テーブル(sample1)  text |code ------------------------------------------------- (1)NBAバスケットは今シーズン熱い戦いが繰り広げられるだろう | 11 (2)戦争は映画の中でけの戦いにしてほしい | 11 (3)名探偵と言えば、ホームズ?今はコナンになるのか? | 12 テーブル(c_text) g_code | num | word ---------------------- 11 | 1100 |NBA 11 | 1100 |バスケ 11 | 1100 |MJ 11 | 1100 |ダンク 11 | 1101 |映画 11 | 1101 |監督 11 | 1102 |戦争 11 | 1102 |戦い 12 | 1200 |データベース 1.テーブル(sample1)のcodeがテーブル(buf1)のg_numと等しいレコード。   ここでは、(1)と(2)のレコードが対象となる。 2.codeとテーブル(c_text)のg_codeが等しいwordを用いて、   textを文字検索を行う(LIKEを用いて部分一致検索)を行う。 text LIKE '%'|| word ||'%' 3.textにwordが存在するnumの出現回数を数えて、最も出現回数の   高いnumをテーブル(sample1)の各レコードのnum値とする。 レコード(1)の場合、num(1100)が2回(NBAとバスケ)出現しており、 num(1102)が1回(戦い)が出現しているがnum=1100の方が出現回数が高いため レコード(1)のnumは1100とする。 最終的欲しいのは、 text |code|num ------------------------------------------------- NBAバスケットは今シーズン熱い戦いが繰り広げられるだろう | 11 |1100 戦争は映画の中でけの戦いにしてほしい| 11 |1102 です。 説明がわかりにくくて申し訳ございません。 なるべく一時テーブルなど作成せずに SQL一文で処理がしたいです。 どうぞよろしくお願い致します。

  • MySQLでのあいまい検索について、教えてください。

    MySQLでのあいまい検索について、教えてください。 長いですが、最後までお付き合いください。 今、入っている全データは、以下の通りです。 fieldはnum,nameです。 1 あいうえお 1 かきくけこA 1 さしすせそB 1 たちつてとC 1 まみむめもF 2 あいうえお 2 かきくけこA 2 さしすせそB 3 わおん 3 らりるれろA 3 たちつてとC 3 なにぬねのD 4 かきくけこA 4 はひふへほE 4 まみむめもF 5 Aあいうえお 6 あいAうえお 7 あい A うえお ここから、あいまい検索でnameに「A」を含むものを抽出したいので、 select num, name from ○○ where name like '%A%' order by num; としました。すると出てくるのは、 1 かきくけこA 1 たちつてとC 1 まみむめもF 2 かきくけこA 3 らりるれろA 3 たちつてとC 4 まみむめもF 4 かきくけこA 5 Aあいうえお 6 あいAうえお 7 あい A うえお が出てきてしまいます。「A」が含まれる物は全て出ますが、それ以外の物まで出ます。 また、「C」で同じことをすると、 1 たちつてとC 3 らりるれろA 3 たちつてとC 「E」では、 3 らりるれろA 3 なにぬねのD 4 はひふへほE 「D」でも別の物が出てきます。しかし「B」「F」は正常に出ます。 他にも、ひらがな「に」でやってみても、 3 らりるれろA 3 なにぬねのD と出ます。 なぜ、このようになってしまうのでしょうか? あいまい検索の仕方を間違っているのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • こんばんは。

    こんばんは。 軽いSQL文がかけずに困っております。 どなたかご教示願います。Postgres8.3になります。 テーブル名 num カラムはuserとidとします。 データは最下部にあるように持ちます。 a~eのユーザのうち、idが2200番台のうち、2201と2202だけをもつユーザを抽出するSQL文を望みます。 a:2200と2203が存在するので偽 b:真 c:2202が無いので偽 d:2203が存在するので偽 e:真 このようなSQLを書きました。 1.numより2201を持つuser 2.numより2202を持つuser 3.numより22~で始まる以外のuser それぞれの等しいuserが真と思ったのですが、本来3.では22~始まるidを持たないuser としなければなりませんでした。 ここで詰まってしまい、タイムアップとなってしまいました。 どのようなSQLが望ましいでしょうか。 よろしくお願いいたします。 select * from num as m, (select x.user from (select user from num where id = 2201 group by user_id) as x, (select user from num where id = 2202 group by user_id) as y, (select user from num where id::text not like '22%' group by user) as z where x.id = y.id and x.id = z.id and y.id = z.id) as n where m.id = n.id; num user,id a,1000 a,1100 a,2000 a,2100 a,2200 a,2201 a,2202 a,2203 a,3000 b,1000 b,2100 b,2201 b,2202 b,3000 b,3100 c,1000 c,2201 c,2203 c,3000 c,3100 c,3200 d,1000 d,2100 d,2201 d,2202 d,2203 d,3000 d,3100 d,3200 e,1000 e,2201 e,2202 e,3000 e,3100 e,3200 e,3300

  • 連想配列からセレクトボックスを生成する

    javascriptで連想配列から特定のキーについてセレクトボックスを生成することはできますか? PHPの例文はあったのですができればjavascriptでやりたいと思っています。 連想配列↓ var profile = [ { name : 'Aさん', tall : '150cm', like : '映画', }, { name : 'Bさん', tall : '160cm', like : '野球', }, { name : 'Cさん', tall : '170cm', like : 'テニス', } ]; があるとして、<body>内に上記のnameだけを抽出したセレクトボックスを作りたいです。 上記の配列の内容はどんどん増えていく予定です。(Dさん、Eさん…というように) ↓めざす完成形 <select id="Namesct"> <option>Aさん</option> <option>Bさん</option> <option>Cさん</option> </select> どうかご教授いただきたく、よろしくお願いいたします。

  • データの抽出について

    エクセルにてデータの抽出をしたいのですが、わからないので教えてください。 例えば、下の様なデータがあります。 回数   1回目   2回目   3回目   4回目 1000    あ      a      A      0 1001    い       b       B      1  1002    う       c       C      2 1003    え      d       D      3   1004    お      e       E      4  1005    か      f       F      5 別のシートに、 回数の1001と入力すると、3回目のBが抽出    1003と入力すると、3回目のDが抽出    1005と入力すると、3回目のFが抽出出来る様にしたいです わかりにくい文章ですいませんが、ご回答よろしくお願いします。 

  • こういうビューを抽出したいのですが...

    こういうビューを抽出するSQLを書きたいのですが、わからず困っています。 TableA (主キー:ID)  ID│CodeA ──┼───── 0001│123 0002│234  :│: TableB (主キー:ID)  ID│CodeA │CodeB │Name ──┼───┼───┼───   1│123  │A1  │XXX   2│123  │B1  │YYY   3│123  │C1  │ZZZ 欲しい抽出結果 (CodeBとNameは1行に最大5回まで存在しうる)  ID│CodeA │CodeB1│Name1 │CodeB2│Name2 │CodeB3│Name3 ──┼───┼───┼───┼───┼───┼───┼─── 0001│123  │A1  │XXX  │B1  │YYY  │C1  │ZZZ こういうのってSELECT文だけで記述できるのでしょうか? どのように記述すれば良いでしょうか?

  • SELECT文

    strSQL = "SELECT * FROM 拠点 WHERE (削除<>'2' or 削除 is NULL) and エリアID like '日本%' ORDER BY 並び順" rsDB.open strSQL,conDB,3,3 a=1 s=0 do until rsDB.eof s=s+1 T(a,s)=rsDB.fields("名称").value TJ(a,s)=rsDB.fields("住所").value rsDB.movenext loop 上記で、日本だけではなく、いくつかSELECT文で抽出したいのですが、 a=1 日本 a=2 北海道 a=3 東北 a=4 関東 a=5 関西 のように、SELECT文で、抽出したものを、置換えしたいのですが、 どのように書いたらいいですか?

  • エクセル、任意の「行」だけを抽出したい。

    こんなことできますか? A1:F100のセル内にランダムに数字が入っています。 質問1) この中から 1行目→3行目→5行目と一つ飛ばしで入っているデータを抽出してH1:M100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 A1-B1-C1-D1-E1-F1 A2-B2-C2-D2-E2-F2 A3-B3-C3-D3-E3-F3 A4-B4-C4-D4-E4-F4 A5-B5-C5-D5-E5-F5 A6-B6-C6-D6-E6-F6 A7-B7-C7-D7-E7-F7 ・・・ A100-B100-C100-D100-E100-F100 の中から A1-B1-C1-D1-E1-F1 A3-B3-C3-D3-E3-F3 A5-B5-C5-D5-E5-F5 ・・・ を抽出して H1-I1-J1-K1-L1-M1 ・・・ H100-I100-J100-K100-L100-M100 の範囲内に表示させたいです。 質問2) 同様に、 1行目→4行目→7行目と二つ飛ばしで入っているデータを抽出してO1:T100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 ※ 説明がわかりにくいかもしれませんが、よろしくお願いします。

  • perlでの文字抽出

    はじめて質問させていただきます。 perlでの文字抽出について教えてください! ---------------------------- #c,aaaaa,0000 #c,bbbbb,00000 #c,bbbbb,0000 : #s,dddd,AAAA,xxxxx,yyyyy time,1 id, 1 type,1 : #e #s,eeee,AAAA,bbbb,cccccc time,2 id,2 type,2 : #e #s,fff,BBBB,zzzzzz,kkkkk time,1 id,1 type,1 : #e #s,eeeee,AAAA,rrr,qqqqqqqqq time,3 id,1 type,3 : #e : ---------------------------- のようなテキストファイルがあります。 #sから#eまでがひとくくりで、それが繰り返し出現し、それぞれの#sから#eまでの長さはバラバラです。 このとき、#sの行の3番目の要素がAAAAで、かつid,1となっているものについて、それぞれの要素を抽出しcsvファイルに ---------------------------- time   id    type 1     1     1 3     1     3 : ---------------------------- のように書き出したいのですが、perlのプログラムはどのようにしたらよいのでしょうか? ---------------------------- while(<INFILE>){  if(/^#s/../^#e/){   if(($_=~/AAAA/){    if($_=~/id,1/)){ : ---------------------------- とするとif(($_=~/AAAA/)で、#sの行しか抽出できないためid,1の検索が出来ず、行き詰ってしまいました。 perlを勉強し始めたばかりの超初心者で、質問が分かりにくいかと思いますが、よろしくお願いします。