2012-01-09 3 views
3

Возможно, этот вопрос дубликат, но я не могу найти ответ для своей задачи. Я имею следующую таблицу со следующими данными:Группа Mysql по одному полю и заказывайте другим

full table data

Мне нужно, чтобы выбрать данные с уникальным oid и с максимальной датой для каждого подъязычного. У меня есть эти вопросы, но они работают неправильно:

SELECT `oid`, `pvalue`, `date` 
FROM `report` 
WHERE `deviceid` = 'MRA-1011' 
    AND `date` <= '2012-01-20 00:00:00' 
GROUP BY oid 
HAVING `date` = MAX(`date`) 
ORDER BY `date` DESC; 

SELECT `oid`, `pvalue` 
FROM `report` 
WHERE `deviceid` = 'MRA-1011' 
    AND `date` <= '2012-01-20 00:00:00' 
GROUP BY oid 
ORDER BY `date` DESC; 

Я хочу, чтобы получить этот результат:

correct result

+0

добавьте результат этих запросов наряду с чем и хотят от него .. \ –

+0

@ саши-кант, посмотри, исправьте мой вопрос! – pltvs

ответ

2

Вам нужно использовать подзапрос вдоль линий:

SELECT oid, pvalue FROM report 
JOIN (SELECT oid, MAX(date) AS maxDate FROM report r WHERE `deviceid` = 'MRA-1011' 
AND `date` <= '2012-01-20 00:00:00' GROUP BY oid) AS foo 
ON foo.oid=r.oid AND foo.maxDate = report.date; 

Если report.date не уникален, вы можете захотеть группировать его во внешнем запросе

+0

Здесь есть небольшая ошибка. У вас не может быть r.oid вне скобки, где вы определяете отчет r. – leMoisela

0
SELECT `oid`, `pvalue` 
FROM `report` AS `r1` 
WHERE `deviceid` = 'MRA-1011' 
    AND `date` <= '2012-01-20 00:00:00' 
    AND `date` = (SELECT MAX(`date`) 
       FROM `report` AS `r2` 
       WHERE `r1`.`oid` = `r2`.`oid` 
       ) 
; 
-1

Для того, чтобы иметь такой результат, вы должны

ORDER BY `date` ASC: 

SELECT `oid`, `pvalue` 
FROM `report` 
WHERE `deviceid` = 'MRA-1011' 
AND `date` <= '2012-01-20 00:00:00' 
GROUP BY oid 
HAVING `date` = MAX(`date`) 
ORDER BY `date` ASC; 
+0

Это неправильный ответ. – pltvs

1

Постарайся это ::

SELECT `oid`, `pvalue`, `date`, MAX(`date`) 
FROM `report` 
WHERE `deviceid` = 'MRA-1011' 
AND `date` <= '2012-01-20 00:00:00' 
GROUP BY oid 
HAVING `date` = MAX(`date`) 
ORDER BY `date` DESC; 
Смежные вопросы