【问题标题】:Filtering out duplicate entires for older rows过滤掉旧行的重复条目
【发布时间】:2019-10-23 00:00:12
【问题描述】:

有 2 张桌子;

  • 引用商品信息和库存数量的 OITM
  • OINM 引用所有项目库存量的所有更改。

目前,我已经构建了一个 SQL,允许我通过加入表来选择对 Item 库存的新更改,但是我遇到了有时存在重复条目的问题,当 OINM 对同一个 Item 进行两次更改时。

这是我目前拥有的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 的条目,我只需要最近的更改。 (因此,我需要过滤掉第 3 个结果,只返回最近的第 4 个。)

我该怎么办?因为我的排序是按 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

问候

编辑:对于将来阅读并查看答案的任何人,请注意,对于我的情况,信息的实际排序并不重要,因为我不关心它是最新的变化,只过滤掉重复项。对于实际的最新表,您需要将 Order By 子句从子查询更改为 ORDER BY T1.\"DocDate\",T1.\"DocTime\" DESC,并且可以选择在整个查询结束时再次对结果进行排序。

【问题讨论】:

  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example 尝试在rextester.com 中创建样本
  • 添加了预期的输出。 DB Schema 是无关紧要的(每个表有超过 200 个字段),因为我只需要处理这个问题提到的 3 个字段(ItemCode、DocTime、DocDate)。我提供了一个示例,该示例应用作示例数据和当前输出。
  • 您必须提供样本数据和预期输出。就像你给我看一个蛋糕并告诉我复制但不告诉我你使用什么成分。您可以提供问题的简化模式。但是架构有助于查看您使用什么索引,什么是 pk,什么是 fk。

标签: java sql hana


【解决方案1】:

您可以像这样使用 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 多年前的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2018-09-29
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多