1

我有一个看起来像这样的表:

字大贵聪明快

狗 9 -10 -20 4
教授 2 4 40 -7
法拉利 7 50 0 48
阿拉斯加 10 0 1 0
蚋 -3 0 0 0

+ 和 - 值与单词相关联,因此教授很聪明,狗不聪明。阿拉斯加很大,占与其条目相关的总价值的比例,而 gnat 则相反。

有没有一种好方法可以获得离零最远的数字的绝对值,以及绝对值是否 =/= 值?相关地,我如何计算给定值的结果相对于其他值是否成比例地大?我会写一些东西来格式化输出:“狗:不聪明,可能不贵;教授聪明;法拉利:快,贵;阿拉斯加:大;蚊子:可能很小。” (格式不是问题,只是一个说明,我被困在基础查询上。)

此外,程序的其余部分是 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

问题似乎是您主要想在一行内工作,而这些类型的问题在 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

你可以使用内置的数据库聚合函数,比如 MAX(column) 吗?

于 2008-10-07T05:22:33.650 回答
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 回答