SQL跨列绝对值
我有一个表格,大概长这样:
word big expensive smart fast dog 9 -10 -20 4 professor 2 4 40 -7 ferrari 7 50 0 48 alaska 10 0 1 0 gnat -3 0 0 0
表格里的 + 和 - 值是和单词相关联的,比如“教授”是聪明的,而“狗”则不是聪明的。“阿拉斯加”很大,相对于它的总值来说,而“蚊子”则正好相反。
有没有什么好的方法可以找到离零最远的数字的绝对值,并且判断这个绝对值和原值是否不相等?另外,我该如何计算某个值相对于其他值来说是否比例上很大?我想写一些代码来格式化输出,比如:“狗:不聪明,可能不贵;教授:聪明;法拉利:快,贵;阿拉斯加:大;蚊子:可能小。”(格式化不是问题,只是个例子,我在基础查询上卡住了。)
另外,程序的其他部分是用 Python 写的,所以如果有任何使用普通数据库 API 模块或更抽象模块的 Python 解决方案,任何帮助都非常感谢。
5 个回答
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中处理,而不是在你选择的编程语言中。
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;
3
绝对值离零最远:
select max(abs(mycol)) from mytbl
如果这个值是负数,那么结果会是零:
select n+abs(mycol)
from zzz
where abs(mycol)=(select max(abs(mycol)) from mytbl);