我可以对检索到的数据集中的每个元组使用MAX函数

时间:2010-03-28 12:07:41

标签: sql mysql

我的表结果包含字段:

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。

提前致谢。

4 个答案:

答案 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有一个更优雅的解决方案!