SQL сравнить локальное (групповое) максимальное значение с глобальным максимальным значением в таблице - PullRequest
1 голос
/ 18 апреля 2020

можно ли сравнить локальное максимальное значение (от group by) с глобальным максимальным значением за один выбор? Теперь, если я хочу получить x со значением group_max_y == global_max_y, я использую этот запрос

SELECT x FROM table_name GROUP BY x HAVING MAX(y) = (SELECT MAX(y) FROM table_name); 

x y
1 1
1 3
2 1

2 2
2 0

3 3

Ожидается: x = (1,3)

Есть ли простой способ сделать это без используя второй выбор?

1 Ответ

0 голосов
/ 18 апреля 2020

Если ваша база данных поддерживает оконные функции, вы можете сделать:

SELECT x, max_y
FROM (
    SELECT x, MAX(y) max_y, RANK() OVER(ORDER BY MAX(y) DESC) rn
    FROM table_name 
    GROUP BY x 
) t
WHERE rn = 1

В некоторых базах данных есть более подходящие решения. SQL Сервер имеет TOP (1) WITH TIES, поэтому вы можете сделать:

SELECT TOP (1) WITH TIES x, MAX(y) max_y
FROM table_name
GROUP BY x
ORDER BY max_y DESC

Или для баз данных, которые поддерживают стандартное условие ограничения строк, например Oracle:

SELECT x, MAX(y) max_y
FROM table_name
GROUP BY x
ORDER BY max_y DESC
FETCH FIRST 1 ROW WITH TIES
...