#oracle #view
#Oracle #Вид
Вопрос:
Максимальное значение Oracle через объединение двух таблиц что я делаю не так?
tblKG:
KG_USER KG_DATE KG_TK_NO KG_SQ_NO KG_CNG_IND
---------------------------------------------------------
123456 200820 1 1 B
123456 200820 2 1 A
123456 200820 3 1 A
123456 200820 4 1 I
123456 200820 4 2 F
123456 200820 4 3 I
123456 200820 4 4 F
123456 200820 4 5 I
123456 200820 4 6 F
123456 200820 4 7 A
tblKN:
KN_USER KN_DATE KN_SQ_NO KN_SEQ_NUMB
--------------------------------------------------
123456 200820 1 01
123456 200820 2 01
123456 200820 3 01
123456 200820 4 07
Вид:
SELECT
N.KN_DATE AS DATE,
N.KN_USER AS USER,
N.KN_SEQ_NO,
G.KG_TK_NO,
G.KG_DATE,
G.KG_USER,
G.KGCNG_IND,
G.MAX_SEQ_NO
FROM
KN N,
(SELECT
KG_TK_NO,
KG_DATE,
KG_USER,
KG_CNG_IND AS KGCNG_IND,
MAX(KG_SEQ_NO) AS MAX_SEQ_NO
FROM
KG
GROUP BY KG_TK_NO, KG_DATE, KG_USER, KG_CNG_IND
) G
WHERE
N.KN_DATE = G.KG_DATE
AND N.KN_USER = G.KG_USER
AND N.KN_SEQ_NO = G.KG_TK_NO
Результат:
DATE USER KN_SEQ_NO KG_TK_NO KGCNG_IND MAX_SEQ_NO
200820 123456 1 1 B 1
200820 123456 2 2 A 1
200820 123456 3 3 A 1
200820 123456 4 4 A 7
200820 123456 4 4 F 6
200820 123456 4 4 I 5
Ожидается:
DATE USER KN_SEQ_NO KG_TK_NO KGCNG_IND MAX_SEQ_NO
200820 123456 1 1 B 1
200820 123456 2 2 A 1
200820 123456 3 3 A 1
200820 123456 4 4 A 7
Комментарии:
1. Извините, что я скопировал вставку из одного из других окон. :/
Ответ №1:
Если вы хотите получить максимальное значение, вы используете MAX
и GROUP BY
. Но на самом деле вы этого не хотите, вы хотите получить строку с максимальным значением.
Для этого вам нужно ранжировать строки в соответствии с интересующим вас столбцом, а затем просто использовать первый.
SELECT * FROM
(SELECT
KG_TK_NO,
KG_DATE,
KG_USER,
KG_CNG_IND,
KG_SEQ_NO,
RANK() OVER (PARTITION BY KG_TK_NO, KG_DATE, KG_USER
ORDER BY KG_SEQ_NO DESC) AS R
FROM KG)
WHERE R = 1
Ответ №2:
Подозреваю, что из вашего ожидаемого результата вам не нужна четвертая переменная GROUP BY.
GROUP BY KG_TK_NO, KG_DATE, KG_USER, ->KG_CNG_IND<-
и что вы хотите MAX_SEQ_NO в этом предложении вместо G.KG_TK_NO
N.KN_SEQ_NO = G.KG_TK_NO
Кстати, с вашими именами столбцов немного сложно работать. Я не нахожу стиль префикса KG_ полезным, хотя он популярен. Но остальные имена слишком короткие.
Комментарии:
1. Извините, это были имена, которые мне дали. Мне нужно вывести cng_ind в результате. Не уверен, что я понимаю.
2. Возможно, вам понадобится cng_ind в результате, но из вашего ожидаемого вывода следует, что вы не хотите, чтобы cng_ind имел значение при определении максимального значения. вместо этого вы просто хотите вернуть его в виде столбца для вывода, как только будет определена «выигрышная» запись. Ответ Ангуса — это более сложный способ получения выигрышной строки.