SQL: извлекать только последний элемент из групп

#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