• 締切済み

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一文で処理がしたいです。 どうぞよろしくお願い致します。

みんなの回答

  • mitu_fu
  • ベストアンサー率90% (9/10)
回答No.3

ここのカテゴリってSQLSERVERですよね? >>text LIKE '%'|| word ||'%' >>今SQLite このあたりを見ると違うDBのような・・ 知識不足でごめんなさい 以下のSQLでうまくいく予定ですが 長文SQLでごめんなさい SELECT A.text,A.code,A.num From ( SELECT sample1.text,sample1.code,c_text.num,Count(*) as 出現回数 FROM sample1,buf1,c_text WHERE sample1.code = buf1.g_num AND sample1.code = c_text.g_code AND sample1.text LIKE '%' + c_text.word + '%' Group By sample1.text,sample1.code,c_text.num ) A ,( SELECT B.text,MAX(出現回数) 出現回数最大 From ( SELECT sample1.text,c_text.num, Count(*) as 出現回数 FROM sample1,buf1,c_text WHERE sample1.code = buf1.g_num AND sample1.code = c_text.g_code AND sample1.text LIKE '%'+c_text.word + '%' Group By sample1.text,c_text.num ) as B Group By B.text ) BB WHERE A.text = BB.text AND A.出現回数 = 出現回数最大

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

SQL Serverのバージョンが7.0以上でないとtopは使えません。 バージョンは大丈夫なのにtopが使えないとすれば、原因は http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q260526 の記述にある障害と同じものかもしれません。 なお、topなしでSQLを記述するのはわたしには無理そうですので他の方にお譲りします。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

パズルとして面白かったのとサンプルのデータがちょっと楽しかったので、挑戦してみました。 select distinct left(s.text,10) text, s.code, c.num   from sample1 s, c_text c, buf1 b   where s.code = c.g_code and      s.code = b.g_num and      c.num = (        select top 1 c2.num          from c_text c2          where s.code = c2.g_code and             s.text like '%' + c2.word + '%'          group by c2.g_code, c2.num          order by count(*) desc, c2.num) (結果) text code num -------------------- ----------- ----------- (1)NBAバスケッ 11 1100 (2)戦争は映画の中 11 1102 ※制限:like演算子による一致の件数が等しくなる複数のnumがある場合、そのうちいちばん小さいnumを返す なお、いろいろな場合に本当にちゃんと動くのか、また動作の効率がどうか等は一切検証していません。

the-ai
質問者

補足

今SQLiteを使用しているため理由はわからないですが、select top 1 ~ が使用できません。 そこで、再度質問ですが、 テーブル(sample1)のtextにwordが一致する最も出現頻度の高いnumを抽出するSQLをよろしくお願い致します。 max()を使うのでしょうか??わかりません。。。

関連するQ&A

  • 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を抽出するにはどうしたらいいのでしょうか? よろしくお願い致します。

  • Mysql delete 参照

    恐れ入ります。 Mysql で、2つのテーブルがあり、 1つが1000レコード 2つめが1500レコードあります。 プライマリーコードを参照して、 1つめの1000レコードに、2つめのテーブルを揃えたいのですが、 うまくいきません。 delete from t2 left join t1 on t2.num=t1.num where t1.num IS NULL; としましたがうまくいきませんでした。 1つめのテーブルのレコードにマッチしたもの以外を2つめのテーブルから削除みたいな感じです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 日付の最大値を検索条件にする方法

    お世話になります。 ORACLEのMAX()関数を使用して、 下記内容を取得するSQLを作成しています。 ・商品テーブルから商品コードを取得したい ・上記の取得条件として、商品テーブルの日付項目が最新日付のレコードのみを 取得したい ・上記の取得条件に加えて、指定したいくつかの商品に該当するもののみを 検索対象としたい 【SQLサンプル】 SELECT 商品コード FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' AND 日付 = (SELECT MAX(日付) FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' ) AND ランク = (SELECT MAX(ランク) FROM 商品テーブル WHERE 商品コード IN (101, 102, 103) AND 在庫区分 = '0' ) 上記以外の書き方で何か良い書き方があれば、 ご教授願えますか? よろしくお願いいたします。

  • ExcelVBAマクロでワードファイル読み込み方法

    ExcelVBAマクロについて確認させてください。 下記のように読み込みたいファイルをフォームで指定して それを変数aに読み込ませています。 ですが、この方法ではテキスト文書しか読み込みが出来ないようです。 ワードファイルも読み込むように設定したいのですが可能でしょうか? 可能でしたらその方法をご教授いただけますでしょうか。 ---------------------------------- Sub sample() Dim buf As String Dim a As String buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル") 'フルパスも含めたファイル名をbufに代入 With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream '指定したファイルを開く a = .ReadAll 'テキスト文書の内容を文字列aに代入 .Close '指定したファイルを閉じる End With End Sub

  • Access2000のMDBファイルをVBScriptやWSH?で

    Access2000のmdbファイルがあります。 VBScriptでテーブル名の一覧をテキストに落としたり、 特定のテーブルのレコードにあるデータに1.05を掛けて テキストにcsvの形で出力させたいのですが、何か良いサンプルはあるのでしょうか?

  • Access クエリについて

    Accessのテーブル1に、フィールド「コード」「回数」があり、レコードとして A,32 B,20 C,13 ・・・というように、ランダムなコードと回数がセットされているとします。コードは主キーです。 このテーブル1を元にしたクエリで A,1 A,2 A,3 ・・・ A,32 B,1 B,2 ・・・ B,20 C,1 C,2 ・・・ C,13 というように、コードごとに「回数」と同じ数のレコードがクエリ上に生成されるようにしたいのですが、こういうことは出来るのでしょうか?出来ればSQLで回答いただけないでしょうか。

  • [Access]テーブルに同じデータがあった場合にまとめる方法

    テーブルのデータの中にまったく同じ内容のレコードがあった場合に、 重複しているレコードを削除し、ダブりをなくしたいのですがどのように すればよいのでしょうか。 ◎テーブルのデータ ID:オートNo. 部門コード:テキスト 色コード:テキスト 色名:テキスト    ↓ 1 A1500 R01 あか 2 A1500 R01 あか 3 A1500 P02 ピンク 4 B1100 P02 ピンク 5 B1100 BR11 茶 6 B1100 BR11 茶 7 B1100 BR11 茶 上記の場合、1と2、5と6と7がそれぞれダブっているので重複している レコードを消して、1つだけ残したい。 要するに、以下のように同じレコードを1つにまとめたいのです。 1 A1500 R01 あか 3 A1500 P02 ピンク 4 B1100 P02 ピンク 5 B1100 BR11 茶 できる方法があれば、教えてください。よろしくお願いします(*゜д゜*)

  • ExcelVBAマクロでワードファイル書き込み方法

    ExcelVBAマクロについて確認させてください。 下記のように読み込みたいWordファイルをフォームで指定して Wordファイルの内容を変数aに読み込ませてます。 変数Xにある任意の文字列を代入し、変数aでその変数Xが検索された場合は その検索された文字列全てを赤文字にして別の名前で保存という方法は可能でしょうか。 可能であればその方法をご教授下さい。 以上、よろしくお願いいたします。 ---------------------------------- Sub sample() Dim buf As String Dim a As String buf = Application.GetOpenFilename(FileFilter:="テキスト文書,*.txt", Title:="サンプル") 'フルパスも含めたファイル名をbufに代入 With CreateObject("Scripting.FileSystemObject").GetFile(buf).OpenAsTextStream '指定したファイルを開く a = .ReadAll 'テキスト文書の内容を文字列aに代入 .Close '指定したファイルを閉じる End With End Sub

  • レコードの更新・置換 (PLSQL)

    こんにちは。 SQLの作成で悩んでいます。 テーブル名:SAMPLE PRIMARY KEY:ID、KBN1、KBN2、CODE ID  KBN1  KBN2  CODE    POINT ---  ----  ----   -----    ------ 1   1    1     '001'    100 1   1    1     '002'    200 1   2    1     '001'    300 1   1    2     '001'    0 2   1    1     '003'    100 ・・・ というテーブルがあります。 以下の処理を行いたいのですが・・・ (1) KBN2=2のレコードのPOINTを更新(または置換)   KBN2=2は1つのIDにつき1つだけです。 (2) 更新内容は次の通りです。   ID、KBN1、CODEが(1)のレコード(KBN2=2のレコード)と同じレコードのPOINTを、(1)のレコードのPOINTに挿入。   SAMPLEテーブルのID=1ならば、4レコード目が (1,1,2,'001',100) になって欲しいのです。 UPDATE文を作成してみたのですが、Setする時のサブクエリ等の誤りで実現しません。 (全部同じポイントになってみたり・・・) 初心者の為、分かり辛い説明で大変申し訳ありませんが、ご助言頂けないでしょうか。 よろしくお願い致します。

  • Access2002 2つのテーブルのマージ方法

    いつもお世話になっております。 クエリについてお聞きします。 現在、2つのAccessDBが稼動しており、それを1つにまとめる作業をしています。 2つのDBには似通ったテーブルが存在し、それをマージする方法で悩んでいます。 テーブルA ・社員番号 ・社員氏名 ・フリガナ ・会社コード ・部署コード テーブルB ・従業員コード ・従業員名カナ ・従業員名 ・所属コード フィールドの定義としましては、 社員番号=従業員コード 社員氏名=従業員名 フリガナ=従業員名カナ 部署コード=所属コード となります。 全てテキストのレコードです。 これを、テーブルAを正にして、テーブルBのデータをAにマージしたいのです。 要件としましては、 1.テーブルAに存在する社員コードにマッチするレコードはそのまま残す(Bのデータは無視) 2.テーブルAに存在せず、Bに存在するものをAに追加する ということです。 クエリを使って色々試しましたが、どうしてもテーブルAに存在するものもアップデートしてしまい、困っています。 どなたかご教授願えれば幸いです。 よろしくお願いいたします。