如何选择一列中的最大值,然后选择另一列中的最大值?
我有一个表看起来像这样:如何选择一列中的最大值,然后选择另一列中的最大值?
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
您可以用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;
我不认为他们只想要最高的'id'。巧合的是它适用于这种情况,但他们想要最高的版本号。至少,我是这么读的。 – AdamMc331 2014-12-06 17:22:23
@ McAdam331。 。 。我只是补充说,如果它恰好适用于OP,并且他/她过于复杂的问题。 – 2014-12-06 17:25:41
是否存在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语句防止版本号错误。
我会写一个子查询获取最大的版本为每个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中正常工作。
使用MAX函数和GROUP BY子句更简单。 – K4timini 2014-12-06 17:11:03
嗯..是的。如果你只需要引号和版本,那么是的,但是如果你想拥有该行的正确ID,那么MAX不能保证给你正确的ID。 – GolezTrol 2014-12-06 17:12:28
如果将ID设置为自动增量,它会很好地工作。 – K4timini 2014-12-06 17:14:30