1

次のようなテーブルがあります。

ワードビッグ高価スマート高速

犬 9 -10 -20 4
教授 2 4 40 -7
フェラーリ 7 50 0 48
アラスカ 10 0 1 0
ブヨ -3 0 0 0

+ と - の値は単語に関連付けられているため、教授は賢く、犬は賢くありません。アラスカは、そのエントリに関連付けられた合計値の割合として大きく、ブヨについてはその逆です。

ゼロから最も遠い数値の絶対値と、絶対値=/=値かどうかのトークンを取得する良い方法はありますか? 関連して、特定の値の結果が他の値に対して比例して大きいかどうかをどのように計算すればよいでしょうか? 「犬: 賢くない、おそらく高価ではない; 教授は賢い; フェラーリ: 速くて高価; アラスカ: 大きい; ブヨ: おそらく小さい」(書式設定は質問ではなく、単なる説明です。根本的なクエリに固執しています。)

また、プログラムの残りの部分は python であるため、通常の dbapi モジュールまたはより抽象的なモジュールを使用した python ソリューションがあれば、助けていただければ幸いです。

4

5 に答える 5

3

大きいの絶対値でリストされた単語:

select word, big from myTable order by abs(big)

各カテゴリの合計:

select sum(abs(big)) as sumbig, 
       sum(abs(expensive)) as sumexpensive,   
       sum(abs(smart)) as sumsmart,
       sum(abs(fast)) as sumfast
  from MyTable;
于 2008-10-07T05:25:12.553 に答える
2

ゼロから最も遠い abs 値:

select max(abs(mycol)) from mytbl

値が負の場合はゼロになります。

select n+abs(mycol)
  from zzz
 where abs(mycol)=(select max(abs(mycol)) from mytbl);
于 2008-10-07T05:28:46.633 に答える
1

問題は、主に 1 つの行内で作業したいことであり、これらのタイプの質問は SQL では答えにくいことです。

あなたが言及した構造を、次のようなより「アトミックな」ファクトテーブルに変えてみます

word property value

基礎となるテーブルを再設計するか (可能であれば、それがアプリケーションの残りの部分に関して意味がある場合)、またはこれを行うビューを次のように定義します。

select word, 'big' as property, big as value from soquestion
UNION ALLL
select word, 'expensive', expensive from soquestion
UNION ALL
...

これにより、各単語の最大値を求めることができます。

select word, max(value), 
    (select property from soquestion t2 
     where t1.word = t2.word and t2.value = max(t1.value))
from soquestion t1
group by word

まだ少し厄介ですが、ほとんどのロジックは SQL であり、選択したプログラミング言語ではありません。

于 2008-10-07T10:39:37.363 に答える
0

質問をすることで問題が明確になりました。これは、私がやろうとしていることをさらに理解する機能です。上記の ¶2 の一部を表現する方法、または で達成しようとしていることを SQL または Python で行うより効率的な方法はありますshow_distinctか?

#!/usr/bin/env python

import sqlite3

conn = sqlite3.connect('so_question.sqlite')
cur = conn.cursor()

cur.execute('create table soquestion (word, big, expensive, smart, fast)')
cur.execute("insert into soquestion values ('dog', 9, -10, -20, 4)")
cur.execute("insert into soquestion values ('professor', 2, 4, 40, -7)")
cur.execute("insert into soquestion values ('ferrari', 7, 50, 0, 48)")
cur.execute("insert into soquestion values ('alaska', 10, 0, 1, 0)")
cur.execute("insert into soquestion values ('gnat', -3, 0, 0, 0)")

cur.execute("select * from soquestion")
all = cur.fetchall()

definition_list = ['word', 'big', 'expensive', 'smart', 'fast']

def show_distinct(db_tuple, def_list=definition_list):
    minimum = min(db_tuple[1:])
    maximum = max(db_tuple[1:])
    if abs(minimum) > maximum:
        print db_tuple[0], 'is not', def_list[list(db_tuple).index(minimum)]
    elif maximum > abs(minimum):
        print db_tuple[0], 'is', def_list[list(db_tuple).index(maximum)]
    else:
        print 'no distinct value'

for item in all:
    show_distinct(item)

これを実行すると、次のようになります。

    犬は賢くない
    教授は賢い
    フェラーリは高い
    アラスカは大きい
    ブヨは大きくない
    >>>
于 2008-10-07T08:41:06.353 に答える
0

MAX(column) のような組み込みのデータベース集計関数を使用できますか?

于 2008-10-07T05:22:33.650 に答える