& Max

2009-08-19 26 views
19

Mam następujące dane w tabeli:& 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 

chciałbym pokazać tylko najnowsze informacje na temat każdej grupy Colums (alarmId, alarmUnit), więc wynik powinien wyglądać tak:

3 test voltage psu  warning 
5 test temp  rcc  ceasing 

próbowałem dotąd:

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

Selecte d Identyfikatory wydają się być w porządku, ale wybrane wiersze nie są do nich odpowiednie. Czy mógłbyś mi pomóc?

Odpowiedz

19

Jeśli chcesz uzyskać rząd maksimum, prawdopodobnie będziesz potrzebować pod-zapytania. Coś jak:

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

To jest dobry standard SQL, który będzie (lub przynajmniej powinien) działać na wielu różnych platformach. Jeśli potrzebujesz więcej wydajności, porównuj z opcjami dostarczonymi przez Quassnoi –

8

Spróbuj:

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

W Oracle, SQL Server 2005+ i 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 

W 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 

W PostgreSQL 8.3 i poniżej:

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

Może spróbuj coś jak następuje:

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

Być może trzeba będzie obejmować alarmId i alarmUnit w zapytaniu sub wybierz.

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