首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取具有最大值的行(列)

获取具有最大值的行(列)
EN

Stack Overflow用户
提问于 2012-07-07 00:12:56
回答 5查看 2.6K关注 0票数 3

每当我使用max函数时,不知何故我就失去了与其他值的所有连接,因此稍后打印的行将不再与我运行max的列相关联。

所以我的表格是:

代码语言:javascript
运行
复制
user col1 col2 col3
1    1    2    3
1    3    4    5
2    2    3    1
3    1    1    3
3    2    4    6
4    5    1    5

所以如果我运行

代码语言:javascript
运行
复制
select user, col1, col2, max(col3) as col3
from table
group by user
order by user;

我会得到

代码语言:javascript
运行
复制
user col1 col2 col3
1    1    2    5
2    2    3    1
3    1    1    6
4    5    1    5

所以col3的最大值是正确的,但是它没有得到该值的正确行。

我想要的是获取列的最大值,并为每个用户返回该行。如果有多个最大值,它应该返回所有用户,即使它具有相同的用户id。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-07 00:19:28

其他数据库(例如MS SQL Server)不允许您将聚合值与非聚合值混合在一起,因为这样会得到错误的结果。

因此,如果您希望从最大值所在的记录中获得非聚合值,请再次对该表进行连接:

代码语言:javascript
运行
复制
select x.user, y.col1, y.col2, x.col3
from (
  select user, max(col3) as col3
  from table
  group by user
) x
inner join table y on y.user = x.user and y.col3 = x.col3
order by x.user
票数 4
EN

Stack Overflow用户

发布于 2012-07-07 00:28:20

这可能看起来很疯狂,但它应该对你有效

代码语言:javascript
运行
复制
SELECT B.* FROM
(
    SELECT user,MAX(col3) col3
    FROM mytable GROUP BY user
) A
INNER JOIN mytable B
USING (user,col3) ORDER BY user,col3;

以下是示例数据:

代码语言:javascript
运行
复制
mysql> DROP DATABASE IF EXISTS terry;
Query OK, 1 row affected (0.06 sec)

mysql> CREATE DATABASE terry;
Query OK, 1 row affected (0.00 sec)

mysql> USE terry
Database changed
mysql> CREATE TABLE mytable
    -> (user INT,col1 INT,col2 INT,col3 int,
    -> key (user,col3));
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO mytable VALUES
    -> (1,    1,    2,    3),(1,    3,    4,    5),
    -> (2,    2,    3,    1),(3,    1,    1,    3),
    -> (3,    2,    4,    6),(4,    5,    1,    5);
Query OK, 6 rows affected (0.07 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM mytable;
+------+------+------+------+
| user | col1 | col2 | col3 |
+------+------+------+------+
|    1 |    1 |    2 |    3 |
|    1 |    3 |    4 |    5 |
|    2 |    2 |    3 |    1 |
|    3 |    1 |    1 |    3 |
|    3 |    2 |    4 |    6 |
|    4 |    5 |    1 |    5 |
+------+------+------+------+
6 rows in set (0.00 sec)

以下是查询的输出:

代码语言:javascript
运行
复制
mysql> SELECT B.* FROM
    -> (
    ->     SELECT user,MAX(col3) col3
    ->     FROM mytable GROUP BY user
    -> ) A
    -> INNER JOIN mytable B
    -> USING (user,col3) ORDER BY user,col3;
+------+------+------+------+
| user | col1 | col2 | col3 |
+------+------+------+------+
|    1 |    3 |    4 |    5 |
|    2 |    2 |    3 |    1 |
|    3 |    2 |    4 |    6 |
|    4 |    5 |    1 |    5 |
+------+------+------+------+
4 rows in set (0.02 sec)

mysql>

此输出将是正确的,因为对于您给出的示例数据中的每个用户,col3的最大值只出现一次。如果给定用户的两行具有与最大值相同的col3,则这两行都应该出现。

为了说明这一点,让我们使用user=3和col3=6添加另一行;

代码语言:javascript
运行
复制
mysql> INSERT INTO mytable VALUES (3,8,9,6);
Query OK, 1 row affected (0.10 sec)

mysql> SELECT B.* FROM
    -> (
    ->     SELECT user,MAX(col3) col3
    ->     FROM mytable GROUP BY user
    -> ) A
    -> INNER JOIN mytable B
    -> USING (user,col3) ORDER BY user,col3;
+------+------+------+------+
| user | col1 | col2 | col3 |
+------+------+------+------+
|    1 |    3 |    4 |    5 |
|    2 |    2 |    3 |    1 |
|    3 |    2 |    4 |    6 |
|    3 |    8 |    9 |    6 |
|    4 |    5 |    1 |    5 |
+------+------+------+------+
5 rows in set (0.00 sec)

mysql>

试一试吧!

票数 2
EN

Stack Overflow用户

发布于 2012-07-07 00:17:31

您需要从查询中删除col1和col2,因为它们使行是惟一的。试一试

代码语言:javascript
运行
复制
SELECT user, max(col3) AS col3 FROM table GROUP BY user ORDER BY user;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11365937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档