【问题标题】:SQL: For each column1 find it's row with max value of column2SQL:对于每个column1,找到column2最大值的行
【发布时间】:2017-01-23 18:29:22
【问题描述】:

我有一张如下所示的表格:

我想为每个 id 获取在反馈中具有最大价值的行。所以我的预期结果应该是这样的:

我试过这样做:

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

我得到每个 ID 一行,但该行不包含原始表中正确行的数据。

哦,我正在使用 mysql。

【问题讨论】:

  • mysql 还是 sql server?
  • @GurV 我删除了 SQL Server 标记

标签: mysql sql mysql-workbench


【解决方案1】:

试试这个:

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 和反馈的行,将返回所有这些行。

【讨论】:

  • 太棒了,我想你已经解决了。但是 t2 在这里代表什么?
  • 它是表的别名,在本例中是子查询。
【解决方案2】:

如果您希望每个 id 有一行,那么请考虑“过滤”,而不是“聚合”。一种方法是相关子查询:

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

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

【讨论】:

    【解决方案3】:

    您还可以通过按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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 2015-08-01
      • 2012-05-29
      • 2022-11-03
      相关资源
      最近更新 更多