如何返回MAX值满足SQL中另一个字段条件的所有行?

时间:2016-12-02 05:39:14

标签: sql max

我有以下costs表:

+--------+------+-----------+
|  Year  |  ID   |  Amount  |
+--------+------+-----------+
|  1960  |  1    |  100     |   
|  1960  |  2    |  200     | 
|  1960  |  3    |  200     |   
|  1960  |  4    |  150     |   
|  1961  |  1    |  300     |   
|  1961  |  2    |  200     |   
|  1961  |  3    |  100     |   
|  1961  |  4    |  300     |     
+---------+------+----------+

我希望所有ID都按年份获得最大金额。例如,对于1960年,我想要ID为#2和3的行。对于1961年,我想要ID为#1和4的行。

SELECT Year, ID, Amount FROM costs WHERE Amount = (SELECT MAX(Amount) FROM costs);

上面给出了所有年份的所有MAX值。但我想要一个条件,只能得到每年的最大金额值。如何添加条件以仅选择年份= 1960的记录?

4 个答案:

答案 0 :(得分:2)

试试这个....它应该有用

SELECT
    *
FROM
    costs
WHERE
    (YEAR, amount) IN (
        SELECT
            YEAR,
            max(amount)
        FROM
            costs
        GROUP BY
            YEAR
    );

答案 1 :(得分:2)

请用以下查询试试。这是经过测试的。工作正常。

点击以下链接,您可以在实时中看到您想要的预期结果。

SQL Fiddle Live Demo

SELECT
    t1.*
FROM
    costs t1
WHERE
    t1.amount = (
        SELECT
            MAX(t2.amount)
        FROM
            costs t2
        WHERE
            t2. `year` = t1. `year`
    );

答案 2 :(得分:1)

应该在所有主要数据库上运行的一个选项是使用子查询来查找每年的最大金额以选择所需的记录:

SELECT c1.*
FROM costs c1
INNER JOIN
(
    SELECT Year, MAX(Amount) AS MaxAmount
    FROM costs
    GROUP BY Year
) c2
    ON c1.Year   = c2.Year      AND
       c1.Amount = c2.MaxAmount

另一种方法是使用相关的子查询:

SELECT c1.*
FROM costs c1
WHERE c1.Amount = (SELECT MAX(c2.Amount) FROM costs c2 WHERE c2.Year = c1.Year)

我希望加入(第一个选项)对于较大的表来说是最快的方法,特别是如果你有合适的索引可以使用。

答案 3 :(得分:0)

NULL