#mysql #sql #group-by #max
#mysql #sql #сгруппировать по #макс
Вопрос:
У меня есть таблица, подобная приведенной ниже (давайте назовем эту таблицу как t1)
---- --------------------- --------- ----------------------- ------- -------------
| id | timestamp | p_value | TS | as_id | codename |
---- --------------------- --------- ----------------------- ------- -------------
| 1 | 2019-03-13 07:55:44 | 561 | 2019-03-13 09:14:31 | 1795 | ActivePower |
---- --------------------- --------- ----------------------- ------- -------------
| 2 | 2019-03-13 07:55:44 | 561 | 2019-03-13 07:53:17 | 1795 | ActivePower |
---- --------------------- --------- ----------------------- ------- -------------
| 3 | 2019-03-13 07:55:45 | 561 | 2019-03-13 07:53:17 | 1795 | ActivePower |
---- --------------------- --------- ----------------------- ------- -------------
| 4 | 2019-03-13 07:55:48 | 974 | 2019-03-13 07:33:21 | 1795 | Cumulative |
---- --------------------- --------- ----------------------- ------- -------------
| 5 | 2019-03-13 07:56:26 | 974 | 2019-03-13 07:33:28 | 1795 | Cumulative |
---- --------------------- --------- ----------------------- ------- -------------
Я хочу выбрать строку с двумя условиями.
- Получите строку с комбинацией для
unique as_id, codename
Итак, вот моя уникальная комбинация
1795, ActivePower
1795, Cumulative
- Фильтруется по максимальному значению временной метки, если максимальная временная метка такая же, то упорядочивайте по идентификатору desc и ограничивайте на 1. Таким образом, я могу получить самую последнюю строку.
Ожидаемый результат:
---- --------------------- --------- ----------------------- ------- -------------
| id | timestamp | p_value | TS | as_id | codename |
---- --------------------- --------- ----------------------- ------- -------------
| 3 | 2019-03-13 07:55:44 | 561 | 2019-03-13 07:53:17 | 1795 | ActivePower |
---- --------------------- --------- ----------------------- ------- -------------
| 5 | 2019-03-13 07:56:26 | 974 | 2019-03-13 07:33:28 | 1795 | Cumulative |
---- --------------------- --------- ----------------------- ------- -------------
Ответ №1:
использует коррелированный подзапрос
select t1.* from table_name t1
where (t1.timestamp,id) in ( select max(timestamp),max(id) from
table_name t2 where t1.as_id=t2.as_id
and t1.codename=t2.codename
)
Ответ №2:
используйте коррелированный подзапрос
select * from tablename a
where id in
(select max(id) from tablename b where a.as_id=b.as_id and a.codename=b.codename)
Ответ №3:
Вы можете получить его с помощью ROW_NUMBER()
SELECT id, timestamp, p_value, TS, as_id, codename
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY as_id, codename ORDER BY TS DESC) AS RN
FROM Table
) AS Q
WHERE RN = 1