ID NAME AMT
1 Name1 1000
2 Name2 500
3 Name3 3000
4 Name1 5000
5 Name2 2000
6 Name1 3000
将上表视为样本。
我的SQL查询出现问题,我是这样使用的。
Select name,amt from sample where amt between 1000 and 5000
它返回表格中1000到5000之间的所有值,而不是我希望获得每个名称的最大金额记录
即,
3 name3 3000
4 name1 5000
5 name2 2000
答案 0 :(得分:1)
select name, max(amt) from sample group by name
但是,你可能会遇到问题,因为可能不止一个。
答案 1 :(得分:1)
你应该按名称分组:
SELECT `name`,MAX(amt) from sample GROUP BY `name` where amt between 1000 and 5000
答案 2 :(得分:0)
select id, name, amt from sample where amt = (select max(amt) from sample)
应返回样本表中具有max amt的所有记录
编辑:
select id, name, amt
from sample
where amt = (
select max(amt)
from sample
where amt between 1000 and 5000)
此查询将返回金额等于1000到5000之间的最大金额的所有记录
答案 3 :(得分:0)
如果你只需要一个包含MAX(amt)的id,那么这就可以了:
SELECT id, name, MAX(amt)
FROM sample
WHERE amt BETWEEN 1000 AND 5000
GROUP BY name;
如果您需要所有ID,那么它会变得更复杂。需要两个查询,以及一个临时表:
CREATE TEMPORARY TABLE maxamts
SELECT name AS maxname, MAX(amt) AS maxamt
FROM sample
WHERE amt BETWEEN 1000 AND 5000
GROUP BY maxname;
SELECT GROUP_CONCAT(id), maxname AS name, maxamt AS amt
FROM maxamts
LEFT JOIN sample ON ((maxname = sample.name) AND (maxamt = amt))
GROUP BY maxname;
简而言之:从查询中创建一个临时表,找到每个名称/ max(amt)对,然后使用该临时表连接回原始表并提取与名称/数量组合匹配的ID。
请记住,group_concat默认限制为1,024个字符,(show variables like '%group_concat%'
以查看服务器上的最大长度),因此如果您有一个大型数据集,请增加该限制,或删除group_concat和从第二个查询分组并解析应用程序中的信息。