#sql #mariadb #groupwise-maximum
#sql #mariadb #groupwise-максимальный
Вопрос:
Получил SQL stmt, где получил HeatingElements с их временем нагрева и временными метками последнего измерения.
SELECT
ts_diff,
name,
s_per_deg,
CAST(dates.gen_date AS DATE) AS gen_date
FROM
heat_data
RIGHT JOIN
dates
ON
dates.gen_date = DATE(ts)
WHERE name != ''
ORDER BY gen_date DESC
Мой вывод на данный момент:
ts_diff name s_per_deg gen_date
202 HeatingElement6HeatTime 33.667 16.08.2020
205 HeatingElement4HeatTime 34.167 16.08.2020
205 HeatingElement5HeatTime 34.167 16.08.2020
208 HeatingElement7HeatTime 34.667 16.08.2020
226 HeatingElement2HeatTime 37.667 16.08.2020
199 HeatingElement6HeatTime 33.167 09.08.2020
202 HeatingElement4HeatTime 33.667 09.08.2020
204 HeatingElement5HeatTime 34.000 09.08.2020
206 HeatingElement7HeatTime 34.333 09.08.2020
223 HeatingElement2HeatTime 37.167 09.08.2020
206 HeatingElement5HeatTime 34.333 07.08.2020
209 HeatingElement7HeatTime 34.833 07.08.2020
228 HeatingElement2HeatTime 38.000 07.08.2020
202 HeatingElement6HeatTime 33.667 07.08.2020
205 HeatingElement4HeatTime 34.167 07.08.2020
198 HeatingElement6HeatTime 33.000 02.08.2020
204 HeatingElement7HeatTime 34.000 02.08.2020
202 HeatingElement5HeatTime 33.667 02.08.2020
201 HeatingElement4HeatTime 33.500 02.08.2020
223 HeatingElement2HeatTime 37.167 02.08.2020
200 HeatingElement6HeatTime 33.333 26.07.2020
203 HeatingElement4HeatTime 33.833 26.07.2020
203 HeatingElement5HeatTime 33.833 26.07.2020
206 HeatingElement7HeatTime 34.333 26.07.2020
223 HeatingElement2HeatTime 37.167 26.07.2020
Я пытаюсь получить только последнюю меру каждого элемента, поэтому мой результат должен выглядеть следующим образом:
ts_diff name s_per_deg gen_date
202 HeatingElement6HeatTime 33.667 16.08.2020
205 HeatingElement4HeatTime 34.167 16.08.2020
205 HeatingElement5HeatTime 34.167 16.08.2020
208 HeatingElement7HeatTime 34.667 16.08.2020
226 HeatingElement2HeatTime 37.667 16.08.2020
Я пытался ORDER BY gen_date GROUP BY name
, но я всегда получаю ошибки. Пока не нашел решения.
Я не могу сказать LIMIT
, потому что в других базах данных я получил другие (больше или меньше элементов).
Ответ №1:
попробуйте использовать аналитические функции!
SELECT ts_diff
, name
, s_per_deg
, gen_date
FROM (
SELECT ts_diff
, name
, s_per_deg
, CAST(dates.gen_date AS DATE) AS gen_date
, ROW_NUMBER() OVER (PARTITION BY name ORDER BY gen_date DESC) rn
FROM heat_data
RIGHT JOIN dates ON dates.gen_date = DATE(ts)
WHERE name != ''
) a
WHERE rn = 1
(Изменен раздел в соответствии с комментарием ниже)
Комментарии:
1. Спасибо, что вы отлично работаете, мне нужно было только изменить
PARTITION BY ts_diff
наPARTITION BY name