SQL:对于每个column1,找到最大值为column2的行

时间:2017-01-23 18:29:23

标签: mysql sql mysql-workbench

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

Table To SELECT from

我想为每个id获取反馈中具有最大价值的行。所以我的预期结果应如下所示:

Wanted Result

我试过这样做:

SELECT  id, course_number, rate_average, max(feedbacks)
FROM [Table]
GROUP BY id;

我每个ID都获得一行,但该行不包含原始表中右行的数据。

哦,我正在使用mysql。

3 个答案:

答案 0 :(得分:2)

试试这个:

select t.*
from your_table t
inner join (
    select
        id, max(feedbacks) feedbacks
    from your_table
    group by id
) t2 on t.id = t2.id and t.feedbacks = t2.feedbacks;

找到id和最大反馈,并将其与原始表连接以获取相关行。

请注意,如果有多个行具有相同的ID和反馈,则会返回所有这些行。

答案 1 :(得分:0)

如果你想要每个id一行,那么想想"过滤",而不是"聚合"。一种方法是相关子查询:

select t.*
from t
where t.feedbacks = (select max(t2.feedbacks)
                     from t t2
                     where t2.id = t.id
                    );

注意:如果多行具有相同的最大值,那么这将返回id的所有行。如果这是一个问题,您可能应该提出另一个问题,并在这种情况下指定您想要返回的内容。

答案 2 :(得分:0)

您还可以按id列顺序按feedbacks列的降序添加行号组来实现此目的。

<强>查询

select t1.``id`, t1.`course_number`, t1.`rate_average`, t1.`feedbacks` from 
(
    select `id`, `course_number`, `rate_average`, `feedbacks`, 
    (
        case `id` when @curA 
        then @curRow := @curRow + 1 
        else @curRow := 1 and @curA := `id` end 
    ) as `rn` 
    from `your_table_name` t, 
    (select @curRow := 0, @curA := '') r 
    order by `id`, `feedbacks` desc 
)t1 
where t1.`rn` = 1;