2015-11-13 107 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) 
) 

子查询中获得各组的ID /最大值,并且父/外部查询联接agains子选择的结果,以获得其余字段为行( s)最大值出现在上面。

+0

为什么''在'inner join'上留下了'join'? –

+0

我的习惯的力量。我写的大部分查询往往是左连接。在这种情况下无关紧要,因为您知道数据将在双方都可用,因为“双方”具有相同的源数据。 –

0

尝试:

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);