Mysql группа по одному полю и порядок по другому - PullRequest
3 голосов
/ 09 января 2012

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

full table data

Мне нужно выбрать данные с уникальным oid и максимальной датой для каждого 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

Ответы [ 4 ]

3 голосов
/ 09 января 2012

Вам необходимо использовать подвыбрать в следующих строках:

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 не уникален, вы можете сгруппировать его по внешнему запросу

1 голос
/ 09 января 2012

Попробуйте это ::

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;
0 голосов
/ 09 января 2012

Чтобы получить такой результат, вы должны

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 голосов
/ 09 января 2012
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`
               )
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...