0

我有一个这样的表,其中包含以下值

销售表

| Year | Profit       | 
|------|--------------|
| 1982 | 20           |
| 2000 | 100          |
| 1900 | 10           | 
| 1800 | 2            |

我基本上想选择利润最大的年份,即 2000 年,因为那里的利润是 100。

到目前为止我尝试了什么:

SELECT year FROM Sales WHERE max(profit)

SQL初学者,如果问题太简单,对不起。

不使用限制。

4

3 回答 3

1

该死的,我知道您的问题已在此处得到解答,但我找不到。所以这里。

LIMITS根本无济于事。

你已经很接近了。这就是你想要的。

SELECT year FROM Sales HAVING Profit = MAX(profit)

解释这种魔法的一个好方法HAVING column = FUNC(column)是像这样重构查询。

SELECT Profit, Year
  FROM Sales
 WHERE Profit = (SELECT MAX(Profit) FROM Sales)

您首先扫描表格以找到最高的利润。然后,您会找到具有该值的行(或当心,如果出现平局,则为行)。

于 2020-02-20T21:37:12.967 回答
0
SELECT year FROM
(SELECT year, max(profit) FROM Sales GROUP BY year) a
于 2020-02-20T21:32:49.210 回答
0

@O.Jones 对领带值的评论很到位。

这些很容易导致意外结果,尤其是返回一年的多个结果行。

避免这种情况的一种方法是非常清楚应该返回什么记录,即您可能希望按利润排序时每年的第一个条目。下一个条目可能具有相同的利润值,但不应返回。

在 SQL 中,这可能如下所示:

WITH _profits_in_years  
(YEAR, profit)   as
    (SELECT 1999 AS YEAR, 200 AS Profit FROM dummy UNION ALL
     SELECT 1999 AS YEAR, 50  AS Profit FROM dummy UNION ALL
     SELECT 2000 AS YEAR, 100 AS Profit FROM dummy UNION ALL
     SELECT 2001 AS YEAR, 100 AS Profit FROM dummy UNION ALL
     SELECT 2002 AS YEAR, 200 AS Profit FROM dummy UNION ALL
     SELECT 2002 AS YEAR, 200 AS Profit FROM dummy UNION ALL
     SELECT 2003 AS YEAR, NULL AS Profit FROM dummy  
    )
SELECT DISTINCT
    YEAR, 
    FIRST_VALUE(Profit) OVER 
        (PARTITION BY YEAR
         ORDER BY PROFIT DESC NULLS LAST)
FROM
    _profits_in_years 
于 2020-02-20T23:56:33.087 回答