停留在 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) 上的索引。