Максимальное значение Oracle через объединение двух таблиц

#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 имел значение при определении максимального значения. вместо этого вы просто хотите вернуть его в виде столбца для вывода, как только будет определена «выигрышная» запись. Ответ Ангуса — это более сложный способ получения выигрышной строки.