获取MySql中两列最大值的行

Posted

技术标签:

【中文标题】获取MySql中两列最大值的行【英文标题】:Fetch the row which has the Max value for two column in MySql 【发布时间】:2018-10-14 19:42:22 【问题描述】:

我有一个表,其中包含我想要的 id、primaryid、data、dataname 列 仅包含 max id 和 primaryid 的行

create table #temp
(
    id int,
    primaryid int,
    data   nvarchar(20),
    data_name   nvarchar(30)
)


insert into #temp
values (1,1,'3223sfd','434'),(1,2,'sdfsd','dfsdfsd'),
       (1,3,'sdfs897d','898'),(1,4,'898','545'),(1,5,'898','uuyu'),
       (2,1,'3223sfd','434'),(2,2,'sdfsd','dfsdfsd'),
       (2,3,'sdfs897d','898'),(2,4,'898','545'),(2,5,'898','uuyu')

我通过以下查询实现了这一点

select T.id , T.primaryid , T.data , T.data_name from #temp T , (select ID, max(primaryid) rank from #temp t2  group by id ) as T2
where t.primaryid = t2.rank group by T.id , T.primaryid , T.data , T.data_name

但是我的表有超过 10 万条记录,我想担心这个

将为此优化什么查询?

【问题讨论】:

您的代码不是有效的 mysql。你真正使用的是什么数据库? @Gordon Linoff,使用 MSSQL 但将代码迁移到 MySQL groupwise max 【参考方案1】:

您可以在这里使用subquery

select * 
from #temp t
where primaryid = (select max(tt.primaryid) from #temp tt where tt.id = t.id);

【讨论】:

这是两个数据库最好的解决方案。【参考方案2】:

首先您应该在idprimaryid 上创建index,然后使用join 如下:

SELECT T.id , T.primaryid , T.data , T.data_name FROM #temp T
JOIN (select id, max(primaryid) as primaryid from #temp t2  group by id ) as T2
ON T.id = t2.id and t.primaryid = t2.primaryid

【讨论】:

【参考方案3】:

您似乎正在使用 SQL Server。如果是这样,一种方法是:

select top (1) with ties t.*
from #temp t
order by row_number() over (partition by id order by primaryid desc);

【讨论】:

你的查询给出了错误在预期条件的上下文中指定的非布尔类型的表达式,靠近';'。 @NiteeshKumar... 使用order by 而不是where 子句。

以上是关于获取MySql中两列最大值的行的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 MySQL 中两列范围之间的记录?

选择同一表 SQL 中两列之间存在一对一匹配的行

如何删除R中两列中具有相同值但ID不同的行[重复]

从数据框中删除重复项,基于两列 A,B,在另一列 C 中保持具有最大值的行

获取 ID 列表的行,其中特定字段在 MySQL 数据库中为最大值

mysql中两列之间的区别