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
答案 0 :(得分:4)
如果您想获得最大值,请使用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
答案 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_前缀样式没有用。但其余的名字太短了。