如何选择一列中的最大值,然后选择另一列中的最大值?

问题描述:

我有一个表看起来像这样:如何选择一列中的最大值,然后选择另一列中的最大值?

ID quote_no version 
------------------------ 
1 123  1 
2 123  2 
3 123  1 
4 123  2 
5 321  1 
6 321  1 

我想选择最新版本的每个报价,如果该版本那里有多个记录,我想最高的ID来获得该行。

(在这种情况下,查询应该产生如下结果):

ID quote_no version 
------------------------ 
4 123  2 
6 321  1 

我怎么能做到这一点的查询?

每个组的最新X记录在MySQL中都是一个棘手的问题,除非X是1,就像你的情况一样。你可以这样做。对于每个报价,加入所有具有相同quote_no,但版本更大,或者版本相同但ID更大的行。那么你可以申请一个过滤器,只保留那些行不具有较大的版本:

SELECT 
    t1.* 
FROM 
    YourTable t1 
    LEFT JOIN YourTable t2 ON 
     t2.quote_no = t1.quote_no AND -- Quote must match anyway 
     (t2.version > t1.version OR -- Version must be larger 
     (t2.version = t1.version AND -- Or if version is the same... 
      t2.ID > t1.ID)  -- ID must be larger. 
WHERE 
    t2.quote_no IS NULL 
+0

使用MAX函数和GROUP BY子句更简单。 – K4timini 2014-12-06 17:11:03

+0

嗯..是的。如果你只需要引号和版本,那么是的,但是如果你想拥有该行的正确ID,那么MAX不能保证给你正确的ID。 – GolezTrol 2014-12-06 17:12:28

+0

如果将ID设置为自动增量,它会很好地工作。 – K4timini 2014-12-06 17:14:30

您可以用not exists条款接近这个:

select t.* 
from table t 
where not exists (select 1 
        from table t2 
        where t2.quote_no = t.quote_no and 
         (t2.version > t.version or 
         t2.version = t.version and t2.id > t.id 
         ) 
       ); 

如果你只是想在一个有最高id(这也是您的结果是一致的),你可以这样做:

select t.* 
from table t join 
    (select quote_no, max(id) as maxid 
     from table t 
     group by quote_no 
    ) tt 
    on t.id = tt.maxid; 
+1

我不认为他们只想要最高的'id'。巧合的是它适用于这种情况,但他们想要最高的版本号。至少,我是这么读的。 – AdamMc331 2014-12-06 17:22:23

+1

@ McAdam331。 。 。我只是补充说,如果它恰好适用于OP,并且他/她过于复杂的问题。 – 2014-12-06 17:25:41

+2

是否存在downvote的原因呢?或者这只是对这个问题的所有答案都是恶意的? – 2014-12-06 17:35:15

尝试类似的东西:

SELECT t2.* 
FROM QuoteTable t2 
JOIN (SELECT 
       MAX(ID) AS t1.LatestId, 
       quote_no 
       FROM QuoteTable t1 
       GROUP BY quote_no) 
ON t2.id = t1.LatestId; 

编辑:父SELECT语句防止版本号错误。

+1

只有当ID与版本号码的顺序相同时,这才会起作用。如果是这种情况,那么'版本'可能会过时。例如,如果ID 4的记录不存在,那么尽管版本2适用于记录2,但是MAX(ID)将返回'3',并且'MAX(版本)'仍然会返回'2' Ergo:这可能(并且迟早会)给你错误的ID。 – GolezTrol 2014-12-06 17:15:46

+1

您修改后的查询仍然不正确,只返回最高ID,根本不考虑版本。 – GolezTrol 2014-12-06 17:37:57

我会写一个子查询获取最大的版本为每个quote_no,就像这样:

SELECT quote_no, MAX(version) AS maxVersion 
FROM myTable 
GROUP BY quote_no; 

你可以加入,与原有的表,并使用另一个MAX()函数来获取最大的ID:

SELECT MAX(m.id), m.quote_no, mt.maxVersion 
FROM myTable m 
JOIN(
    SELECT quote_no, MAX(version) AS maxVersion 
    FROM myTable 
    GROUP BY quote_no) mt ON mt.quote_no = m.quote_no AND mt.maxVersion = m.version 
GROUP BY m.quote_no; 

SQL Fiddle中正常工作。