Запрос SQL для последних записей в каждом типе - PullRequest
0 голосов
/ 26 октября 2019

У меня есть таблица, как показано ниже. Где много строк, которые бывают разных типов. Я хочу выбрать только самые новые записи в каждом типе. Конечно, есть записи с разными значениями sensor_external_id и sensor_id.

Мне нужно сгруппировать по sensor_id и type. И для этой группы (sensor_id, type) мне нужно выбрать строки с самыми последними date.

id       average     date                    sensor_external_id    sensor_id    type  value
950                  2019-10-25 20:34:23     2C3AE834ED58          124          3     25
951      25          2019-10-25 20:34:23     2C3AE834ED58          124          0     25
952      56          2019-10-25 20:34:23     2C3AE834ED58          124          2     56
953      43          2019-10-25 20:34:23     2C3AE834ED58          124          1     41
1411                 2019-10-25 20:54:23     2C3AE834ED58          124          3     25
1412     24          2019-10-25 20:54:23     2C3AE834ED58          124          0     23
1413     53          2019-10-25 20:54:23     2C3AE834ED58          124          2     47
1414     41          2019-10-25 20:54:24     2C3AE834ED58          124          1     36

В этом случае мне нужен именно такой результат:

id       average     date                    sensor_external_id    sensor_id    type  value
1411                 2019-10-25 20:54:23     2C3AE834ED58          124          3     25
1412     24          2019-10-25 20:54:23     2C3AE834ED58          124          0     23
1413     53          2019-10-25 20:54:23     2C3AE834ED58          124          2     47
1414     41          2019-10-25 20:54:24     2C3AE834ED58          124          1     36

Я пытался группировать по type и date, но безуспешно.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Это типичный наибольший n на вопрос группы. Общее решение, которое работает в большинстве СУБД с обычно хорошей производительностью, заключается в использовании коррелированного подзапроса:

select t.*
from mytable t
where t.date = (
    select max(t1.date) from mytable t1 where t1.type = t.type
)

Для производительности требуется индекс (type, date).


ЕслиВы хотите самую последнюю запись для type и sensor_id, затем:

select t.*
from mytable t
where t.date = (
    select max(t1.date) 
    from mytable t1 
    where t1.type = t.type and t1.sensor_id = t.sensor_id
)
1 голос
/ 26 октября 2019

Использовать row_number ()

   Select * from(  Select *, 
      row_number() over
    (partition by type order by date desc)
    from table) rn) t where t.rn=1
...