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
Я бы хотел показать только самую последнюю информацию о каждой группе колонок (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;
Выбранные идентификаторы кажутся точными, но выбранные строки не соответствуют им. Не могли бы вы мне помочь?
Ответы
Ответ 1
В 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
В 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
Ответ 2
Если вы хотите получить строку max, вам, вероятно, понадобится подзапрос. Что-то вроде:
SELECT *
FROM YourTable
WHERE id IN (
SELECT MAX(id) FROM YourTable GROUP BY alarmId, alarmUnit
)
Ответ 3
Try:
SELECT * FROM table WHERE id IN
(SELECT MAX(id) FROM table GROUP BY alarmId, alarmUnit)
Ответ 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