mysql — выберите самое последнее значение с помощью where

#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  |
 ---- --------------------- --------- ----------------------- ------- ------------- 
  

Я хочу выбрать строку с двумя условиями.

  1. Получите строку с комбинацией для unique as_id, codename

Итак, вот моя уникальная комбинация

 1795, ActivePower
1795, Cumulative
  
  1. Фильтруется по максимальному значению временной метки, если максимальная временная метка такая же, то упорядочивайте по идентификатору 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