mysql - выберите последнее значение с помощью где - PullRequest
0 голосов
/ 15 марта 2019

У меня есть таблица, как показано ниже (давайте назвали эту таблицу как 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
Отфильтровано по максимальному значению временной метки, если максимальная временная метка совпадает, то упорядочьте по id 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  |
+----+---------------------+---------+-----------------------+-------+-------------+

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

использовать коррелированный подзапрос

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)
0 голосов
/ 15 марта 2019

Вы можете достичь этого с помощью 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
0 голосов
/ 15 марта 2019

использует коррелированный подзапрос

  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
                       )
...