首页 > 解决方案 > 如何加入 2 个表并仅保留最新记录

问题描述

我有 2 张桌子要加入。一个表是库存的历史记录,它具有与每个“件”库存相关联的“最后更新”日期。另一张桌子上有每件的价格。我想加入表格,以便获得每个价格的历史记录。例如。

                  TABLE 1
Date         Item        Location           QTY 
06/01/2020   ABC         123                10
06/01/2020   DEF         234                12
06/02/2020   ABC         345                13
06/06/2020   ABC         123                10


                  TABLE 2
ITEM         Price
ABC          34.5
DEF          52.12

-----------------> result table ------------------>
Date         Item        Location           QTY       Price
06/01/2020   DEF          234               12        34.5
06/02/2020   ABC          345               13        52.12
06/06/2020   ABC          123               10        34.5

结果表在哪里过滤,以便它只保留最近的记录。例如。TABLE1 每分钟更新一次以显示新的库存水平。项目 + 位置组合是“唯一的”,因为 table1 处于项目/位置粒度级别。但是,随着表的更新和创建新条目,可以有许多相同的项目/位置组合(它是一个历史表,因此具有相同项目 + 位置组合的旧条目保留在表中)。有时日期不同,有时日期是同一天。

我写来尝试这样做的查询是:

SELECT DISTINCT
 TB1.DATE
,TB1.ITEM
,TB1.LOCATION
,TB1.QTY
,TB2.ITEM_COST

FROM
(
SCHEMA_1.TABLE1 AS TB1
JOIN  SCHEMA_1.TABLE2 AS TB2

ON TB1.ITEM = TB2.ITEM
JOIN (
      SELECT ITEM AS ITM,
          LOCATION AS LOC,
          MAX(DATE) AS MAXDATE
          FROM SCHEMA_1.TABLE1
          GROUP BY ITEM, LOCATION
      )TB3
  ON TB1.ITEM = TB3.ITM AND TB1.LOCATION= TB3.LOC AND TB1.DATE= TB3.MAXDATE
)

这个查询确实执行了,但它给了我重复,并且绝对不会只过滤最近的记录。不知道我在这里做错了什么。

标签: sqloraclejoinoracle12c

解决方案


好的旧子选择也应该工作。假设 unqiqe 日期每个项目,位置对。

SELECT T1.* , T2.price 
FROM SCHEMA_1.TABLE1 AS TB1
JOIN SCHEMA_1.TABLE2 AS TB2 ON TB1.Item = TB2.Item
WHERE Date = (SELECT MAX(Date) FROM SCHEMA_1.TABLE1 AS TB3
              WHERE TB1.Item = TB3.Item
              AND   TB1.Location = TB3.Location)  
                

推荐阅读