代码之家  ›  专栏  ›  技术社区  ›  Ricardo

Mysql-分组依据并选择最大值

  •  0
  • Ricardo  · 技术社区  · 7 年前

    我有以下表格:

    enter image description here

    我有以下疑问:

    SELECT r.cod_reserva, MAX(r.hora_fin_utc) FROM reservas_tanatosalas r GROUP BY r.cod_tanatosala
    

    结果: cod_reserva . 为什么?

    cod_reserva  MAX(r.hora_fin_utc)
    7           9999999999
    6           9999999999
    

    cod_reserva  MAX(r.hora_fin_utc)
    7           9999999999
    8           9999999999
    

    更新

    cod_reserva将来可能会更改为varchar,因此我不能在上面使用max。

    4 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    请勿使用 GROUP BY 为了这个。您的查询格式不正确,无法在最新版本的MySQL(使用默认设置)或几乎任何数据库中运行。

    select r.*
    from r
    where r.hora_fin_utc = (select max(r2.hora_fin_utc)
                            from reservas_tanatosalas r2
                            where r2.cod_tanatosala = r.cod_tanatosala
                           );
    

    过滤 问题,不是 聚合 问题。您希望筛选数据,以便结果集中只显示最近的行。

    如果性能是个问题,那么您需要一个索引 (cod_tanatosala, hora_fin_utc) .

    以下是您的查询:

    SELECT r.cod_reserva, MAX(r.cod_tanatosala) FROM reservas_tanatosalas r
    GROUP BY r.cod_tanatosala
    HAVING MAX(r.hora_fin_utc)
    

    这是在说:

    • 为的每个值生成一行 cod_tanatosala
    • 返回的最大值
    • 这里的错误:不知道该怎么办 cod_reserva 分组依据 .

    这个 HAVING MAX(r.hora_fin_utc) 都不是 0 也没有 NULL . 不是很有用。

        2
  •  0
  •   Pratik Bhavsar    7 年前

    您正在使用不同的列对resultset进行分组,而select语句引用另一列。以下内容肯定有效,如果不行,请告诉我:

    SELECT 
        r.cod_reserva, MAX(r.hora_fin_utc) 
    FROM 
        reservas_tanatosalas r 
    GROUP BY 
        r.cod_reserva
    HAVING 
        MAX(r.hora_fin_utc)
    
        3
  •  0
  •   Shoyeb Sheikh    7 年前

    我和你查的一样,

    SELECT MAX(r.cod_reserva), MAX(r.hora_fin_utc) FROM reservas_tanatosalas r GROUP BY r.cod_tanatosala
    

    但是我在r.cod_reserva上也使用了一个聚合函数MAX(),因为如果没有它,就会出现一个错误“this is compatible with sql_mode=only_full_group_by”,我让它正常工作,你可以用MAX(r.cod_reserva)测试它。

        4
  •  0
  •   Gro    7 年前

    首先,在大多数数据库(包括新版本的Mysql)中,当您按不属于select的列进行分组时,此代码将发出错误。下面的查询将给出您所显示的数据集的目标

    select (select t.cod_reserva from reservas_tanatosalas t 
            where t.hora_fin_utc = a.max_hora_fin_utc 
            and a.cod_tanatosala = t.cod_tanatosala) cod_reserva, 
            a.max_hora_fin_utc
    from (
        SELECT x.cod_tanatosala, MAX(x.hora_fin_utc)max_hora_fin_utc
        FROM reservas_tanatosalas x group by x.cod_tanatosala
    )a;