Как выбрать значение, связанное с максимальным значением в таблице [БЕЗ ИСПОЛЬЗОВАНИЯ ЛИМИТОВ] - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть такая таблица, которая содержит значения типа

Таблица продаж

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

Я в основном хочу выбрать год с максимальной прибылью, т.е. год 2000, потому что прибыль там составляет 100.

Что я пробовал до сих пор:

SELECT year FROM Sales WHERE max(profit)

Новичок в SQL, извините, если вопрос слишком простой.

БЕЗ ПРЕДЕЛЫ ИСПОЛЬЗОВАНИЯ.

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Черт возьми, я знаю, что на твой вопрос уже дан ответ, но я не могу его найти. Так что здесь идет.

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)

Сначала вы сканируете таблицу, чтобы найти наибольшую прибыль. Затем вы найдете строку (или остерегайтесь строк в случае ie), которые имеют это значение.

0 голосов
/ 21 февраля 2020

@O.Jones замечателен по поводу значений t ie.

Они могут легко привести к неожиданным результатам, особенно возвращая несколько строк результатов в течение года.

One Чтобы избежать этого, нужно четко определить, какую запись следует возвращать, т. е. вы можете захотеть, чтобы первая запись каждого года сортировалась по прибыли. Следующие записи могут иметь такое же значение прибыли, но не должны возвращаться.

В 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 
0 голосов
/ 21 февраля 2020
SELECT year FROM
(SELECT year, max(profit) FROM Sales GROUP BY year) a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...