Oracle Max值通过连接两个表

时间:2011-04-25 21:23:53

标签: oracle view

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 个答案:

答案 0 :(得分:4)

如果您想获得最大值,请使用MAXGROUP 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

答案 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_前缀样式没有用。但其余的名字太短了。