Значение Oracle Max через объединение двух таблиц - PullRequest
3 голосов
/ 26 апреля 2011

Значение Oracle Max через объединение двух таблиц, что я делаю не так?

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

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Если вы хотите получить максимальное значение, вы используете 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 голосов
/ 26 апреля 2011

Подозреваю, что из ожидаемого вывода вам не нужна четвертая переменная 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

ByКстати, с вашими именами столбцов работать немного сложнее.Я не считаю стиль префикса KG_ полезным, хотя он и популярен.Но остальные имена слишком короткие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...