SQL Group by&Max

19 sql group-by max

我在表格中有以下数据:

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
Run Code Online (Sandbox Code Playgroud)

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

3   test    voltage  psu        warning
5   test    temp     rcc        ceasing
Run Code Online (Sandbox Code Playgroud)

我到目前为止尝试过:

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

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

Qua*_*noi 29

Oracle,SQL 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 8.3及以下:

SELECT  DISTINCT ON (alarmId, alarmUnit) *
FROM    mytable
ORDER BY
        alarmId, alarmUnit, id DESC
Run Code Online (Sandbox Code Playgroud)


Chr*_*fer 19

如果你想获得max的行,你可能需要一个子查询.就像是:

SELECT *
FROM YourTable
WHERE id IN (
    SELECT MAX(id) FROM YourTable GROUP BY alarmId, alarmUnit
    )
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的标准SQL,它将(或至少应该)在大量平台上运行.如果您需要更高的性能,请根据Quassnoi提供的选项进行基准测试 (6认同)

ber*_*hof 8

尝试:

SELECT * FROM table WHERE id IN
  (SELECT MAX(id) FROM table GROUP BY alarmId, alarmUnit)
Run Code Online (Sandbox Code Playgroud)