web-dev-qa-db-fra.com

Groupe SQL par & Max

J'ai une donnée suivante dans un tableau:

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

Je voudrais afficher uniquement les informations les plus récentes sur chaque groupe de colonnes (alarmId, alarmUnit), donc le résultat devrait ressembler à ceci:

3   test    voltage  psu        warning
5   test    temp     rcc        ceasing

J'ai essayé jusqu'à présent:

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

Les identifiants sélectionnés semblent bien, mais les lignes sélectionnées ne leur correspondent pas. Pourriez-vous m'aider?

19
chavo5

Dans Oracle, SQL Server 2005+ et 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

Dans 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

Dans PostgreSQL 8.3 et plus bas:

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

Si vous voulez obtenir la ligne du max, vous aurez probablement besoin d'une sous-requête. Quelque chose comme:

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

Essayer:

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

Essayez peut-être quelque chose comme ce qui suit:

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

Vous devrez peut-être inclure alarmId et alarmUnit dans la sélection de sous-requête.

2
mattruma
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
2
user158017