[英]select max valued column row based on multiple columns
I have the following table documents
我有以下表格
documents
+--------+-------------+------------+----------+---------+
| doc_id | module_name | mapping_id | doc_type | version |
+--------+-------------+------------+----------+---------+
| 5 | asdf | asd | POI | 1 |
| 6 | asdf | asd | POI | 2 |
| 7 | asdf | asd | CAF | 1 |
| 8 | asdf | abc | POI | 1 |
| 9 | asdf | abc | ISR | 1 |
| 10 | asdf | abc | ISR | 2 |
| 11 | asdf | xyz | POA | 1 |
| 12 | asdf | xyz | CAF | 1 |
| 13 | asdf | xyz | CAF | 2 |
| 14 | asdf | xyz | CAF | 3 |
| 15 | pqrs | asd | POI | 1 |
| 16 | pqrs | asd | POI | 2 |
| 17 | pqrs | asd | CAF | 1 |
| 18 | pqrs | abc | POI | 1 |
| 19 | pqrs | abc | ISR | 1 |
| 20 | pqrs | abc | ISR | 2 |
| 21 | pqrs | xyz | POA | 1 |
| 22 | pqrs | xyz | CAF | 1 |
| 23 | pqrs | xyz | CAF | 2 |
| 24 | pqrs | xyz | CAF | 3 |
+--------+-------------+------------+----------+---------+
and I want to get results as: 我想得到的结果是:
+--------+-------------+------------+----------+---------+
| doc_id | module_name | mapping_id | doc_type | version |
+--------+-------------+------------+----------+---------+
| 6 | asdf | asd | POI | 2 |
| 7 | asdf | asd | CAF | 1 |
| 8 | asdf | abc | POI | 1 |
| 10 | asdf | abc | ISR | 2 |
| 11 | asdf | xyz | POA | 1 |
| 14 | asdf | xyz | CAF | 3 |
| 16 | pqrs | asd | POI | 2 |
| 17 | pqrs | asd | CAF | 1 |
| 18 | pqrs | abc | POI | 1 |
| 20 | pqrs | abc | ISR | 2 |
| 21 | pqrs | xyz | POA | 1 |
| 24 | pqrs | xyz | CAF | 3 |
+--------+-------------+------------+----------+---------+
where the max
version number row should be returned in combination of module_name
, mapping_id
and doc_type
. 其中应以
module_name
, mapping_id
和doc_type
组合返回max
版本号行。
I am unable to figure out the query. 我无法弄清楚查询。 Need help.
需要帮忙。
In most databases, you would use row_number()
. 在大多数数据库中,您将使用
row_number()
。 In MySQL, this is not available. 在MySQL中,此功能不可用。 One method is
join
and group by
: 一种方法是
join
和group by
:
select t.*
from t join
(select module_name, mapping_id, doc_type, max(version) as version
from t
group by module_name, mapping_id, doc_type
) tt
using (module_name, mapping_id, doc_type, version);
if we take the OP's remarks literally, or possibly just 如果我们按字面意思考虑OP的话,或者可能只是
select t.*
from t join
(select doc_type, max(version) as version
from t
group by doc_type
) tt
using (doc_type, version);
another alternative 另一种选择
select *
from documents d
where not exists
(
select 1 from documents dv
where dv.doc_type = d.doc_type
and dv.version > d.version
)
literally: "there is no bigger version number for same values" 从字面上看: “对于相同的值,没有更大的版本号”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.