【问题标题】:SQL Group by & MaxSQL Group by 和 Max
【发布时间】:2010-11-20 22:29:03
【问题描述】:

我的表格中有以下数据:

id  name    alarmId  alarmUnit  alarmLevel

1   test    voltage  psu        warning
2   test    voltage  psu        ceasing
3   test    voltage  psu        warning
4   test    temp     rcc        warning
5   test    temp     rcc        ceasing

我只想显示每个列组 (alarmId,alarmUnit) 的最新信息,因此结果应如下所示:

3   test    voltage  psu        warning
5   test    temp     rcc        ceasing

到目前为止我已经尝试过:

SELECT MAX(id) as id,name,alarmId,alarmUnit,alarmLevel GROUP BY alarmId,alarmUnit;

选定的 ID 似乎没问题,但选定的行与它们不对应。你能帮帮我吗?

【问题讨论】:

    标签: sql group-by max


    【解决方案1】:

    如果您想获取最大值所在的行,您可能需要一个子查询。比如:

    SELECT *
    FROM YourTable
    WHERE id IN (
        SELECT MAX(id) FROM YourTable GROUP BY alarmId, alarmUnit
        )
    

    【讨论】:

    • 这是一个很好的标准 SQL,可以(或至少应该)在各种平台上工作。如果您需要更高的性能,请对照 Quassnoi 提供的选项进行基准测试
    【解决方案2】:

    试试:

    SELECT * FROM table WHERE id IN
      (SELECT MAX(id) FROM table GROUP BY alarmId, alarmUnit)
    

    【讨论】:

      【解决方案3】:

      OracleSQL Server 2005+PostgreSQL 8.4

      SELECT  *
      FROM    (
              SELECT  *, ROW_NUMBER() OVER (PARTITION BY alarmId, alarmUnit ORDER BY id DESC) AS rn
              FROM    mytable
              ) q
      WHERE   rn = 1
      

      MySQL:

      SELECT  mi.*
      FROM    (
              SELECT  alarmId, alarmUnit, MAX(id) AS mid
              FROM    mytable
              GROUP BY
                      alarmId, alarmUnit
              ) mo
      JOIN    mytable mi
      ON      mi.id = mo.mid
      

      PostgreSQL 8.3 及以下:

      SELECT  DISTINCT ON (alarmId, alarmUnit) *
      FROM    mytable
      ORDER BY
              alarmId, alarmUnit, id DESC
      

      【讨论】:

        【解决方案4】:

        也许可以尝试以下方法:

        SELECT id,name,alarmId,alarmUnit,alarmLevel
        FROM table
        WHERE id IN (SELECT Max(id) FROM table GROUP BY alarmId, alarmUnit)
        

        您可能必须在子查询选择中包含 alarmId 和 alarmUnit。

        【讨论】:

          【解决方案5】:
          select id, name, alarmID, alarmUnit, alarmLevel
          from (select max(id) as id
          from table
          group by alarmID, alarmUnit) maxID
          inner join table
          on table.id = maxID.id
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-05-06
            • 1970-01-01
            • 1970-01-01
            • 2012-10-30
            • 2022-01-04
            • 1970-01-01
            • 2013-04-17
            相关资源
            最近更新 更多