停留在 MySQL 查询,id 相同 quote_num 但最大状态和最大版本
Stuck on MySQL query, id where same quote_num but max status and max version
我有以下 table:
id quote_num version status
1* 1000 1 1
2 1001 1 -1
3* 1001 2 0
4* 1003 1 0
5 1005 1 0
6* 1005 2 1
7 1005 3 0
8* 1007 1 1
9 1007 2 -1
10 1007 3 -1
11 1005 4 0
12 1008 1 -1
13 1008 2 -1
14 1008 3 -1
15* 1008 4 -1
我想获得加星标的 ID。
其中quote_num是相同的,它需要选择第一个具有最高状态的ID,然后是最高版本。
例如。 1005 只有一个状态为 1,因此它的 ID 为 6。
1008 有 4 个状态为 -1,因此它获得最高版本,即 id 15。
我已经为这个 MySQL 查询绞尽脑汁,试图用组和子查询来做到这一点。
例如。
Select * 来自 table where id in (select id from table order by status desc, version desc LIMIT 1);
有什么建议吗?
用ROW_NUMBER()window函数:
SELECT id, quote_num, version, status
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY quote_num ORDER BY status DESC, version DESC) rn
FROM tablename
) t
WHERE t.rn = 1
参见demo。
结果:
> id | quote_num | version | status
> -: | --------: | ------: | -----:
> 1 | 1000 | 1 | 1
> 3 | 1001 | 2 | 0
> 4 | 1003 | 1 | 0
> 6 | 1005 | 2 | 1
> 8 | 1007 | 1 | 1
> 15 | 1008 | 4 | -1
你的方法比较接近。您只需要 =
和一个相关的子查询:
Select t.*
from table t
where t.id = (select t2.id
from table t2
where t2.quote_num = t.quote_num
order by status desc, version desc
limit 1
);
这应该可以利用 (quote_num, status desc, version desc)
上的索引。
我有以下 table:
id quote_num version status
1* 1000 1 1
2 1001 1 -1
3* 1001 2 0
4* 1003 1 0
5 1005 1 0
6* 1005 2 1
7 1005 3 0
8* 1007 1 1
9 1007 2 -1
10 1007 3 -1
11 1005 4 0
12 1008 1 -1
13 1008 2 -1
14 1008 3 -1
15* 1008 4 -1
我想获得加星标的 ID。
其中quote_num是相同的,它需要选择第一个具有最高状态的ID,然后是最高版本。
例如。 1005 只有一个状态为 1,因此它的 ID 为 6。 1008 有 4 个状态为 -1,因此它获得最高版本,即 id 15。
我已经为这个 MySQL 查询绞尽脑汁,试图用组和子查询来做到这一点。
例如。 Select * 来自 table where id in (select id from table order by status desc, version desc LIMIT 1);
有什么建议吗?
用ROW_NUMBER()window函数:
SELECT id, quote_num, version, status
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY quote_num ORDER BY status DESC, version DESC) rn
FROM tablename
) t
WHERE t.rn = 1
参见demo。
结果:
> id | quote_num | version | status
> -: | --------: | ------: | -----:
> 1 | 1000 | 1 | 1
> 3 | 1001 | 2 | 0
> 4 | 1003 | 1 | 0
> 6 | 1005 | 2 | 1
> 8 | 1007 | 1 | 1
> 15 | 1008 | 4 | -1
你的方法比较接近。您只需要 =
和一个相关的子查询:
Select t.*
from table t
where t.id = (select t2.id
from table t2
where t2.quote_num = t.quote_num
order by status desc, version desc
limit 1
);
这应该可以利用 (quote_num, status desc, version desc)
上的索引。