2011-04-25 129 views
3

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 

VIEW:

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 
+0

什么是SHRTCKN? – 2011-04-25 21:33:25

+0

对不起,KN从其他窗口中的一个复制粘贴。 :/ – AhsenB 2011-04-25 21:38:36

回答

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 
+0

作品谢谢!只需要添加我的其他和statings :) – AhsenB 2011-04-25 22:38:50

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_前缀。但其余的名字太短。

+0

对不起,这些是我给的名字。我需要输出结果中的cng_ind。不知道我是否遵循。 – AhsenB 2011-04-25 22:03:22

+1

您可能需要结果中的cng_ind,但是从您的预期输出看,您不希望cng_ind在确定MAX时起作用。相反,只要确定了“获胜”记录,您只需要将其作为输出列回来。安格斯的回答是获得胜利的更复杂的方式。 – 2011-04-25 22:13:15