java - 过滤掉旧行的重复条目

标签 java sql hana

有 2 张 table ;

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

目前,我已经构建了一个 SQL,允许我通过连接表来选择对商品库存的新更改,但我遇到了有时会出现重复条目​​的问题,即当 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

问候

编辑:对于任何将来阅读并检查答案的人,请注意,对于我的情况,信息的实际顺序并不重要,因为我不关心它是最新的更改,只过滤掉重复项。对于实际的最新表,需要将子查询中的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 多年前的语法。

关于java - 过滤掉旧行的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58507324/

相关文章:

java - 选择jcombobox中的数据,点击按钮后在jtextfield中获取其对应的数据库值

java - 参数匹配器的使用无效。如果此方法使用另一个私有(private)方法,我该如何测试它?

php - mysql 基于另一列的 AUTO_INCRMENT

HANA SQLScript dbms_output.put_line() 等效吗?

python - PyHDB 和 HANA 客户端的 hdbcli python 包有什么区别?

java - 将 ArrayFixture 与包含嵌套非原始对象的对象列表一起使用

java - 如何使用 NSIS 脚本在运行时读取属性文件?

sql - 如何在线程中异步执行大量 SQL 查询

python - 带参数和通配符运算符的 pandas read_sql

abap - 从 CDS 实体中选择还是从 CDS 数据库 View 中选择