过滤掉旧行的重复条目
Filtering out duplicate entires for older rows
有 2 个 table;
- 引用项目信息和库存数量的 OITM
- OINM 引用所有项目库存量的所有变化。
目前,我已经构建了一个 SQL,通过加入 table 可以让我 SELECT 对物品库存进行新的更改,但我已经 运行当 OINM 对同一项目进行两次更改时,有时会出现重复条目的问题。
这是我目前的SQL如下:
SELECT T0.\"ItemCode\", T0.\"WhsCode\", T0.\"OnHand\", T0.\"IsCommited\", T0.\"OnOrder\", T1.\"DocDate\", T1.\"DocTime\"
FROM KA_DEV6.OITW T0,KA_DEV6.OINM T1
WHERE T0.\"WhsCode\" = '01' AND T0.\"ItemCode\" = T1.\"ItemCode\"
AND (T1.\"DocDate\" > '2019-10-20' OR (T1.\"DocDate\" = '2019-10-20' AND T1.\"DocTime\" >= '1025'))
这将输出以下结果:
|ItemCode:CC01.NB.C.LF.F.LI.V.0813.GRCE|WhsCode:01|OnHand:8.000000|IsCommited:4.000000|OnOrder:0.000000|DocDate:2019-10-22 00:00:00.000000000|DocTime:1024
|ItemCode:JO.C.LF.U.LI.V.0004. 22.NG|WhsCode:01|OnHand:1.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1223
|ItemCode:JO.I.FT.M.AB.C.0106. L.NG|WhsCode:01|OnHand:32.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1401
|ItemCode:JO.I.FT.M.AB.C.0106. L.NG|WhsCode:01|OnHand:38.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1402
问题是有些条目具有相同的 ItemCode,我只需要最近的更改。 (因此,我需要过滤掉第三个结果,只返回最近的第四个结果。)
我该怎么做?因为我的排序是按2个字段(DocDate和DocTime),然后过滤掉重复的。
订购已经是我可以做的事情了,正在添加
ORDER BY T1.\"DocDate\", T1.\"DocTime\" ASC
但是我如何过滤掉重复项?
预期输出为:
|ItemCode:CC01.NB.C.LF.F.LI.V.0813.GRCE|WhsCode:01|OnHand:8.000000|IsCommited:4.000000|OnOrder:0.000000|DocDate:2019-10-22 00:00:00.000000000|DocTime:1024
|ItemCode:JO.C.LF.U.LI.V.0004. 22.NG|WhsCode:01|OnHand:1.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1223
|ItemCode:JO.I.FT.M.AB.C.0106. L.NG|WhsCode:01|OnHand:38.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1402
此致
编辑:对于将来阅读并检查答案的任何人,请注意,对于我的情况,信息的实际排序并不重要,因为我不关心它是最新的更改,只是过滤掉重复。对于实际最近的 table,您需要将子查询中的 Order By 子句更改为 ORDER BY T1.\"DocDate\",T1.\"DocTime\" DESC
,并且可选地,在整个查询的末尾再次对结果进行排序。
您可以像这样使用 ROW_NUMBER 窗口函数:
SELECT *
FROM (
SELECT T0.\"ItemCode\", T0.\"WhsCode\", T0.\"OnHand\", T0.\"IsCommited\", T0.\"OnOrder\", T1.\"DocDate\", T1.\"DocTime\",
ROW_NUMBER() OVER (PARTITION BY T0.\"ItemCode\" ORDER BY T1.\"DocTime\" DESC) AS RN
FROM KA_DEV6.OITW T0
JOIN KA_DEV6.OINM T1 ON T0.\"WhsCode\" = '01' AND T0.\"ItemCode\" = T1.\"ItemCode\"
WHERE T1.\"DocDate\" > '2019-10-20' OR (T1.\"DocDate\" = '2019-10-20' AND T1.\"DocTime\" >= '1025')
) X
WHERE RN = 1
注意——我还使用了标准连接语法,而不是您使用的 20 多年前的语法。
有 2 个 table;
- 引用项目信息和库存数量的 OITM
- OINM 引用所有项目库存量的所有变化。
目前,我已经构建了一个 SQL,通过加入 table 可以让我 SELECT 对物品库存进行新的更改,但我已经 运行当 OINM 对同一项目进行两次更改时,有时会出现重复条目的问题。
这是我目前的SQL如下:
SELECT T0.\"ItemCode\", T0.\"WhsCode\", T0.\"OnHand\", T0.\"IsCommited\", T0.\"OnOrder\", T1.\"DocDate\", T1.\"DocTime\"
FROM KA_DEV6.OITW T0,KA_DEV6.OINM T1
WHERE T0.\"WhsCode\" = '01' AND T0.\"ItemCode\" = T1.\"ItemCode\"
AND (T1.\"DocDate\" > '2019-10-20' OR (T1.\"DocDate\" = '2019-10-20' AND T1.\"DocTime\" >= '1025'))
这将输出以下结果:
|ItemCode:CC01.NB.C.LF.F.LI.V.0813.GRCE|WhsCode:01|OnHand:8.000000|IsCommited:4.000000|OnOrder:0.000000|DocDate:2019-10-22 00:00:00.000000000|DocTime:1024
|ItemCode:JO.C.LF.U.LI.V.0004. 22.NG|WhsCode:01|OnHand:1.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1223
|ItemCode:JO.I.FT.M.AB.C.0106. L.NG|WhsCode:01|OnHand:32.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1401
|ItemCode:JO.I.FT.M.AB.C.0106. L.NG|WhsCode:01|OnHand:38.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1402
问题是有些条目具有相同的 ItemCode,我只需要最近的更改。 (因此,我需要过滤掉第三个结果,只返回最近的第四个结果。)
我该怎么做?因为我的排序是按2个字段(DocDate和DocTime),然后过滤掉重复的。
订购已经是我可以做的事情了,正在添加
ORDER BY T1.\"DocDate\", T1.\"DocTime\" ASC
但是我如何过滤掉重复项?
预期输出为:
|ItemCode:CC01.NB.C.LF.F.LI.V.0813.GRCE|WhsCode:01|OnHand:8.000000|IsCommited:4.000000|OnOrder:0.000000|DocDate:2019-10-22 00:00:00.000000000|DocTime:1024
|ItemCode:JO.C.LF.U.LI.V.0004. 22.NG|WhsCode:01|OnHand:1.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1223
|ItemCode:JO.I.FT.M.AB.C.0106. L.NG|WhsCode:01|OnHand:38.000000|IsCommited:0.000000|OnOrder:0.000000|DocDate:2019-10-21 00:00:00.000000000|DocTime:1402
此致
编辑:对于将来阅读并检查答案的任何人,请注意,对于我的情况,信息的实际排序并不重要,因为我不关心它是最新的更改,只是过滤掉重复。对于实际最近的 table,您需要将子查询中的 Order By 子句更改为 ORDER BY T1.\"DocDate\",T1.\"DocTime\" DESC
,并且可选地,在整个查询的末尾再次对结果进行排序。
您可以像这样使用 ROW_NUMBER 窗口函数:
SELECT *
FROM (
SELECT T0.\"ItemCode\", T0.\"WhsCode\", T0.\"OnHand\", T0.\"IsCommited\", T0.\"OnOrder\", T1.\"DocDate\", T1.\"DocTime\",
ROW_NUMBER() OVER (PARTITION BY T0.\"ItemCode\" ORDER BY T1.\"DocTime\" DESC) AS RN
FROM KA_DEV6.OITW T0
JOIN KA_DEV6.OINM T1 ON T0.\"WhsCode\" = '01' AND T0.\"ItemCode\" = T1.\"ItemCode\"
WHERE T1.\"DocDate\" > '2019-10-20' OR (T1.\"DocDate\" = '2019-10-20' AND T1.\"DocTime\" >= '1025')
) X
WHERE RN = 1
注意——我还使用了标准连接语法,而不是您使用的 20 多年前的语法。