Как выбрать максимальное значение после подсчета в Oracle?
У меня есть запрос:
SELECT
CST_CON_ID as ID_USER,
X_TYPE_FOURTH_LVL as ELEMENT_TYPE,
COUNT(X_TYPE_FOURTH_LVL) as T_REPEAT
FROM
SIEBEL.S_SRV_REQ
GROUP BY
CST_CON_ID,
X_TYPE_FOURTH_LVL
ORDER BY
CST_CON_ID;
Который возвращает следующую информацию при запуске:
ID_USER ELEMENT_TYPE T_REPEAT
1-1HQR-1380 REPOSITION 3
1-1HQR-1380 CANCELED 4
1-1HQR-1380 INFORMATION 1
1-1HQR-1380 SELLS 90
1-1HQR-1380 PROMOTIONS 3
1-1HQR-1380 ACCOUNTS 5
1-1HQR-1250 ACTIONS 34
1-1HQR-1250 PROG 60
1-1HQR-1250 INFORMATION 3
1-1HQR-1560 SELLS 40
1-1HQR-1560 BUYS 2
1-1HQR-1560 REPOSITION 1
1-1HQR-1560 PROMOTIONS 70
Но теперь я хочу только извлечь для каждого ID_USER
максимальное значение T_REPEAT
, Ожидаемый результат, который я хочу, выглядел бы так:
ID_USER ELEMENT_TYPE T_REPEAT
1-1HQR-1380 SELLS 90
1-1HQR-1250 PROG 60
1-1HQR-1560 PROMOTIONS 70
Можно ли получить этот вывод, используя только один запрос?
2 ответа
Решение
Одним из вариантов является использование row_number()
:
SELECT ID_USER, ELEMENT_TYPE, T_REPEAT
FROM (SELECT CST_CON_ID as ID_USER, X_TYPE_FOURTH_LVL as ELEMENT_TYPE,
COUNT(X_TYPE_FOURTH_LVL) as T_REPEAT,
ROW_NUMBER() OVER (PARTITION BY CST_CON_ID ORDER BY COUNT(X_TYPE_FOURTH_LVL) DESC) AS Seq
FROM SIEBEL.S_SRV_REQ
GROUP BY CST_CON_ID, X_TYPE_FOURTH_LVL
) t
WHERE Seq = 1;
РЕДАКТИРОВАТЬ: Если у вас есть связи с количеством, то используйте dense_rank()
функция вместо:
Обернуть текущий оператор в подзапрос.
SELECT ID_USER, ELEMENT_TYPE, MAX(T_REPEAT)
FROM (
SELECT
CST_CON_ID as ID_USER,
X_TYPE_FOURTH_LVL as ELEMENT_TYPE,
COUNT(X_TYPE_FOURTH_LVL) as T_REPEAT
FROM
SIEBEL.S_SRV_REQ
GROUP BY
CST_CON_ID,
X_TYPE_FOURTH_LVL
ORDER BY
T_REPEAT
)
GROUP BY ID_USER