我的表结果包含字段:
id count
____________
1 3
2 2
3 2
从这张表中我必须形成另一个表得分,该表应如下所示
id my_score
_____________
1 1.0000
2 0.6667
3 0.6667
那是my_score=count/MAX(count)
但如果我将查询作为
create TEMPORARY TABLE(select id,(count/MAX(count)) AS my_score from result);
仅检索第1行。
任何人都可以建议查询,以便为所有元组计算my_score。
提前致谢。
答案 0 :(得分:2)
SELECT
a.ID,
a.count / b.total
FROM result as A
CROSS JOIN (SELECT MAX(Count) AS Total From Result) AS B
B只返回一行,因此您希望将表格的笛卡尔乘积与其自己的聚合相对应,以获得最终值。
答案 1 :(得分:1)
不确定这是否适用于mysql,但请尝试:
select id, count / (select max(count) from result) as my_score
from result
答案 2 :(得分:0)
我认为您不能在一个步骤中对每一行应用聚合函数。使用存储过程分两步进行计算 - 计算最大值并将其存储在变量中,然后进行选择并将计数除以变量。或者,您可以使用子查询,但我并不认为这是一种改进。
create procedure calculate_score
begin
declare maxcount decimal(6,4);
set maxcount := select max(count) from result;
select id, count / maxcount as score from result;
end
注意:我不确定MySQL是否会隐式处理从int到decimal的数据转换或者列的类型。如果需要手动处理数据转换,则必须调整上述内容。
答案 3 :(得分:0)
我会因为可能的性能问题而犹豫不决,但在语义上这应该有效:
select
a.id
, a.count / b.count
from
result a cross join result b
where
b.count = (select max(count) from result)
编辑:@eftpotrm有一个更优雅的解决方案!