SQL跨列绝对值

2 投票
5 回答
5103 浏览
提问于 2025-04-11 09:31

我有一个表格,大概长这样:

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);

撰写回答