如何选择与表中的最大值关联的值 [不使用限制]
Posted
技术标签:
【中文标题】如何选择与表中的最大值关联的值 [不使用限制]【英文标题】:How to pick a value associated with the maximum value in a table [WITHOUT USING LIMITS] 【发布时间】:2020-06-05 07:12:05 【问题描述】:我有一个这样的表,其中包含类似的值
销售表
| Year | Profit |
|------|--------------|
| 1982 | 20 |
| 2000 | 100 |
| 1900 | 10 |
| 1800 | 2 |
我基本上想选择利润最大的年份,即 2000 年,因为那里的利润是 100。
到目前为止我尝试了什么:
SELECT year FROM Sales WHERE max(profit)
SQL初学者,如果问题太简单,请见谅。
没有使用限制。
【问题讨论】:
什么版本的 mysql? 你愿意分享你为什么不想使用LIMIT
吗?
【参考方案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)
您首先扫描表格以找到最高的利润。然后,您会找到具有该值的行(或当心,如果出现平局,则为行)。
【讨论】:
【参考方案2】:SELECT year FROM
(SELECT year, max(profit) FROM Sales GROUP BY year) a
【讨论】:
我认为相当于SELECT DISTINCT year FROM Sales;
我很惊讶有多少回答者如此专注于解决问题,以至于他们未能对他们的回答进行简化。【参考方案3】:
@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
【讨论】:
以上是关于如何选择与表中的最大值关联的值 [不使用限制]的主要内容,如果未能解决你的问题,请参考以下文章