我的桌子看起来像这样:
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
我怎么能在查询中这样做?
答案 0 :(得分:2)
您可以使用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 :(得分:2)
我会编写一个子查询,为每个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中正常工作。
答案 2 :(得分: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
答案 3 :(得分:-2)
尝试类似的东西:
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语句可防止版本号错误。