2015-11-13 2 views
-1

Я пытаюсь получить строки, которые имеют максимальное значение в каждой группе.Строки с максимальным значением каждой группы

У меня есть эти столы

+-------+-----------+--------------+-----------+ 
| nid |  name | crated  | grp_id | 
+-------+-----------+--------------+-----------+ 
| 1 | RAND_NAME |  123  |  11 | 
| 2 | EHllo  |  111  |  11 | 
| 3 | Stop by |  444  |  11 | 
| 4 | Radr c |  555  |  11 | 
| 5 | NAE  |  666  |  22 | 
| 6 | ABC  |  1234  |  22 | 
| 7 | RAND  |  123  |  22 | 
| 8 | YELLO  |  444  |  22 | 
| 9 | AAA  |  555  |  33 | 
| 10 | WWW  |  1235  |  33 | 
| 11 | ADF  |  553  |  33 | 
+-------+-----------+--------------+-----------+ 

Итак, я хочу этой таблицу

+-------+-------------+------------+-----------+ 
| nid |  name | created | grp_id | 
+-------+-------------+------------+-----------+ 
| 3 | Stop by  | 555  |  11 | 
| 6 | ABC   | 1234  |  22 | 
| 10 | WWW   | 1235  |  33 | 
+-------+-------------+------------+-----------+ 

, который означает, что я хочу, чтобы захватить строки, которые имеют наибольшее значение, созданные в каждой группе. Таблица будет сгруппирована по grp_id.

Я думал так:

SELECT nid, name, created, grp_id 
    FROM table t 
    WHERE t.created = (SELECT MAX(t1.created) FROM table t1) 
    GROUP BY grp_id 
    ORDER BY grp_id 

Но это не сработало. Что мне делать, чтобы получить три разные строки с наивысшим созданным значением в каждой группе?

Благодарим вас за понимание моего плохого объяснения.

+2

Почему 444> 555 в GRP 11? – Sentinel

+0

Извините, ошибка. изменил значение. – PHG

ответ

0

Вам нужен подвыбор:

SELECT yourtable.* 
FROM yourtable 
LEFT JOIN (
    SELECT grp_id, MAX(created) AS max 
    FROM yourtable 
    GROUP BY grp_id 
) AS maxgroup ON (
    (yourtable.grp_id = maxgroup.grp_id) AND (yourtable.created = maxgroup.max) 
) 

подвыбор получает идентификатор/максимальное значение для каждой группы, и родитель/внешний запрос присоединяется Agains результатов подвыборки, чтобы получить остальную часть полей для строки (s), что отображается максимальное значение.

+0

Почему 'left join' над' inner join'? –

+0

силу привычки с моей стороны. большинство запросов, которые я пишу, как правило, остаются объединенными. не имеет значения в данном конкретном случае, поскольку вы ЗНАЕТЕ, что данные будут доступны с обеих сторон, поскольку «обе» стороны имеют одинаковые исходные данные. –

0

Try:

SELECT nid, name, MAX(created), grp_id FROM t GROUP BY grp_id; 
+0

Это, вероятно, будет работать в 'mySql', но очень далеко от ANSI SQL –

0
SELECT nid, name, MAX(created), grp_id 
FROM table 
GROUP BY grp_id 
order by MAX(nid); 
Смежные вопросы