Несколько вариантов для вас, что требуют только один просмотр таблицы:
SQL Fiddle
Oracle 11g R2 Настройка схемы:
CREATE TABLE C (ID, SALARY) AS
SELECT 1, 100 FROM DUAL
UNION ALL SELECT 2, 110 FROM DUAL
UNION ALL SELECT 3, 100 FROM DUAL
UNION ALL SELECT 4, 110 FROM DUAL
UNION ALL SELECT 5, 90 FROM DUAL
запроса 1 - получить единый идентификатор:
SELECT *
FROM (
SELECT ID, SALARY
FROM c
ORDER BY SALARY DESC
)
WHERE ROWNUM = 1
Results:
| ID | SALARY |
|----|--------|
| 2 | 110 |
Запрос 2 - получить единый идентификатор (метод альтернативного, который будет получать минимальный и максимальные идентификаторы):
SELECT MAX(ID) KEEP (DENSE_RANK LAST ORDER BY SALARY) AS MAX_SALARY_ID,
MAX(SALARY) AS MAX_SALARY,
MIN(ID) KEEP (DENSE_RANK FIRST ORDER BY SALARY) AS MIN_SALARY_ID,
MIN(SALARY) AS MIN_SALARY
FROM C
Results:
| MAX_SALARY_ID | MAX_SALARY | MIN_SALARY_ID | MIN_SALARY |
|---------------|------------|---------------|------------|
| 4 | 110 | 5 | 90 |
Query 3 - Получить все идентификаторы с максимальной зарплатой:
SELECT ID, SALARY
FROM (
SELECT ID,
SALARY,
RANK() OVER (ORDER BY SALARY DESC) AS RNK
FROM C
)
WHERE RNK = 1
Results:
| ID | SALARY |
|----|--------|
| 2 | 110 |
| 4 | 110 |
Query 4 - Получить все идентификаторы минимального и максимального оклада:
SELECT LISTAGG(CASE MIN_RANK WHEN 1 THEN ID END, ',') WITHIN GROUP (ORDER BY ID) AS MIN_SALARY_IDS,
MAX(CASE MIN_RANK WHEN 1 THEN SALARY END) AS MIN_SALARY,
LISTAGG(CASE MAX_RANK WHEN 1 THEN ID END, ',') WITHIN GROUP (ORDER BY ID) AS MAX_SALARY_IDS,
MAX(CASE MAX_RANK WHEN 1 THEN SALARY END) AS MAX_SALARY
FROM (
SELECT ID,
SALARY,
RANK() OVER (ORDER BY SALARY ASC) AS MIN_RANK,
RANK() OVER (ORDER BY SALARY DESC) AS MAX_RANK
FROM C
)
Results:
| MIN_SALARY_IDS | MIN_SALARY | MAX_SALARY_IDS | MAX_SALARY |
|----------------|------------|----------------|------------|
| 5 | 90 | 2,4 | 110 |
Запрос 5:
SELECT ID,
SALARY,
CASE WHEN MIN_RANK = 1 THEN 'MIN'
WHEN MAX_RANK = 1 THEN 'MAX' END AS MIN_MAX
FROM (
SELECT ID,
SALARY,
RANK() OVER (ORDER BY SALARY ASC) AS MIN_RANK,
RANK() OVER (ORDER BY SALARY DESC) AS MAX_RANK
FROM C
)
WHERE MIN_RANK = 1 OR MAX_RANK = 1
Results:
| ID | SALARY | MIN_MAX |
|----|--------|---------|
| 2 | 110 | MAX |
| 4 | 110 | MAX |
| 5 | 90 | MIN |
, что если доля двух идентификаторов максимум? Вы хотите оба? –
@MichaelBroughton Да, я делаю. И я хочу, чтобы он сочетался с максимальным и минимальным. –