2009-08-19 9 views
19

J'ai des données suivantes dans un tableau:groupe SQL par & 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 

Je voudrais montrer que les plus récentes informations sur chaque groupe colums (AlarmId, alarmUnit), de sorte que le résultat devrait être comme 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;

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

Répondre

19

Si vous voulez obtenir la ligne du maximum, 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 
    ) 
+6

Ceci est un bon SQL standard qui fonctionnera (ou devrait au moins) fonctionner sur une large gamme de plates-formes. Si vous avez besoin de plus de performance, comparez les options fournies par Quassnoi –

8

Essayez:

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

En 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 

En 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 

En PostgreSQL 8.3 et ci-dessous:

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

Peut-être essayer 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 devez inclure AlarmId et alarmUnit dans la sous requête de sélection.

2
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