Dúvida SQL, como selecionar apenas o último registro de cada device

Pessoal, estou com um problema aqui e preciso da ajuda de vcs :). Tenho a seguinte tabela

Table Name: Location

+------------+----------+--------------+--------------+----------+
| locationId | deviceId | dataRegistro | horaRegistro | location |
+------------+----------+--------------+--------------+----------+
|         50 |        1 |   2012-11-07 |     15:35:00 |      A12 |
+------------+----------+--------------+--------------+----------+
|         51 |        1 |   2012-11-07 |     15:37:40 |       B2 |
+------------+----------+--------------+--------------+----------+
|         52 |        2 |   2012-11-07 |     15:35:12 |       B8 |
+------------+----------+--------------+--------------+----------+
|         53 |        2 |   2012-11-07 |     15:35:40 |      50C |
+------------+----------+--------------+--------------+----------+
|         54 |        2 |   2012-11-07 |     15:40:00 |      94A |
+------------+----------+--------------+--------------+----------+

Preciso selecionar o ultimo registro de cada device… para um único device faço

select L from Location L where deviceId = :deviceId order by "dataRegistro" DESC, "horaRegistro" DESC limit 1

Agora como fazer para selecionar a última location de vários devices?? :frowning:

Se alguem puder ajudar, fico muito grato :slight_smile:

Obrigado,

Cara,
Tente fazer o seguinte…

Rola tirar esse campo ‘dataRegistro’ e alterar o campo ‘horaRegistro’ para TIMESTAMP (data e hora).
E ae basta no SELECT ou no código-fonte da aplicação extrair as informações de data e/ou hora desejada…

// caso se mantenha os dois campos
SELECT 
	locationId, deviceId, MAX(dataRegistro), MAX(horaRegistro), location
FROM
	Location
GROUP BY
	deviceId
;

// caso altere o campo horaRegistro para TIMESTAMP
SELECT 
	locationId, deviceId, MAX(horaRegistro), location
FROM
	Location
GROUP BY
	deviceId
;

Pensou em fazer um sub select ?

Obrigado Bruno, mesmo se eu fizer o update da tabela para um único campo não dá certo, pois no select não posso ter os campos locationId, location por causa do group by pelo deviceId dá o seguinte erro

OLá Weslei, pensar pensei :), mas não consegui chegar a uma query :frowning: para resolver o problema, mesmo com subselect, alguma idéia?

Obrigado,

Opa…

Veja ae se essa query rola…

SELECT
	l1.*
FROM
	Location l1,
	( SELECT deviceId, MAX(horaRegistro) AS horaRegistro FROM Location GROUP BY deviceId ) l2
WHERE
	l1.deviceId = l2.deviceId
	AND l1.horaRegistro = l2.horaRegistro
;