我有一组数据,如:
Nm | item | type | value
21 | 19 | A | 15
22 | 40 | B | 10
21 | 20 | A | 80
32 | 40 | C | 40
我尝试了几个查询,我总是得到:(对于记录Nm = 21)
Nm | item | type | max(value)
21 | 19 | A | 80
这不是我想要的,因为最大值来自item = 20
答案 0 :(得分:2)
select
* from table t1 where nm=21
order by value desc
limit 1
答案 1 :(得分:1)
您需要找到特定nm具有最大值的行。为此,您需要查找每个nm并在子查询中查找最大值,然后将该最大值与主查询进行比较。
<强>查询:强>
select *
from item_table it_o
where it_o.value in
(select max(value)
from item_table it_i
where it_i.nm=it_o.nm)
<强>输出:强>
nm item type value
22 40 B 10
21 20 A 80
32 40 C 40
答案 2 :(得分:1)
SELECT Nm, item, type, value
FROM ( SELECT Nm, MAX( value ) AS value
FROM YourTable
GROUP
BY Nm ) AS m
NATURAL JOIN YourTable
WHERE Nm = 21;
我被要求提供解释,所以这里是:
首先,您需要找到最大值(您还没有给出表名,因此我将使用YourTable
):
SELECT MAX( value ) AS value
FROM YourTable
WHERE item = 21
其次,您希望将需要加入上表格表达式的所有属性投影回YourTable
,但我们无法做到这一点,因为我们还没有预测Nm
属性。
我们很容易认为我们可以简单地投射属性:
SELECT Nm, MAX( value ) AS value
FROM YourTable
WHERE item = 21
然而,这使得SQL barf。为了让SQL开心,我们必须使用SQL相当笨重的GROUP BY
语法来说明我们总结的列(无论它有多么明显!):
SELECT Nm, MAX( value ) AS value
FROM YourTable
WHERE item = 21
GROUP
BY Nm
现在我们可以加入YourTable
,但事情并非如此简单:
SELECT Nm, item, type, value
FROM ( SELECT Nm, MAX( value ) AS value
FROM YourTable
WHERE Nm = 21
GROUP
BY Nm )
NATURAL JOIN YourTable;
再次,SQL barfs因为我们没有给我们的派生表一个名字。现在您可能想知道,如果我们使用NATURAL JOIN
,给它起一个名字有什么意义,其中一个优点是INNER JOIN
,我们不需要范围变量?嗯,没有必要,这是不需要的。但是,SQL标准声明它是必需的。因此,我们被迫包括一个名称,尽管它是:
SELECT Nm, item, type, value
FROM ( SELECT Nm, MAX( value ) AS value
FROM YourTable
WHERE Nm = 21
GROUP
BY Nm ) AS pointless_name
NATURAL JOIN YourTable;
注意我上面的SQL代码是不同的:一个人应用了一个经验来改变查询的结构,使其通常更有用(对不起,我没有超出直觉的解释!)
答案 3 :(得分:1)
你必须做order by item desc
所以最大值先来,然后通过limit 1
SELECT * FROM TABLE ORDER BY VALUE DESC LIMIT 1
或者您可以在子查询中选择max id并在主查询中选择该id(此查询可以返回多行)
SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE)
答案 4 :(得分:0)
SELECT a.*
FROM YourTable a
JOIN
( SELECT nm
, MAX(value) value
FROM YourTable
GROUP
BY nm
) b
ON b.nm = a.nm
AND b.value = a.value
答案 5 :(得分:0)
您可以尝试这样
select * from tablename where value = (SELECT MAX(value) FROM tablename )
OR
select top 1 * from tablename order by value desc