【问题标题】:Return closest timestamp from Table B based on timestamp from Table A with matching Product IDs根据表 A 中具有匹配产品 ID 的时间戳返回表 B 中最接近的时间戳
【发布时间】:2022-12-23 23:29:19
【问题描述】:

目标:创建查询以根据来自另一个表(表 A)的库存调整结果为产品 ID 提取最近的周期盘点事件(表 C)。

将使用表 A 中的所有记录,但不保证在表 C 中具有匹配项。

ID 列将出现在两个表中,但在两个表中都不是唯一的,因此每个表都需要 ID 和时间戳对。

当前简化的 SQL


SELECT
    A.WHENOCCURRED,
    A.LPID,
    A.ITEM,
    A.ADJQTY,
    C.WHENOCCURRED,
    C.LPID,
    C.LOCATION,
    C.ITEM,
    C.QUANTITY,
    C.ENTQUANTITY
FROM
    A
LEFT JOIN
    C
ON A.LPID = C.LPID     
WHERE
     A.facility = 'FACID'
     AND A.WHENOCCURRED > '23-DEC-22'
     AND A.ADJREASONABBREV = 'CYCLE COUNTS'
ORDER BY A.WHENOCCURRED DESC
;

这是目前在 LPID 比赛中对 C.WHENOCCURRED 的第一次命中。在朝着基于 WHENOCCURRED 创建 2 个临时表的方向前进之前,想看看是否有更简单的 JOIN 解决方案。

我在 Excel 中有一个正常运行的 INDEX(MATCH(MIN()) 解决方案,但它需要先导出几个系统报告,并且使用 X,XXX 行表时速度非常慢。

【问题讨论】:

    标签: oracle-sqldeveloper


    【解决方案1】:

    如果您使用的是 Oracle 12 或更高版本,则可以使用 LATERAL join 和 FETCH FIRST ROW ONLY

    SELECT A.WHENOCCURRED,
           A.LPID,
           A.ITEM,
           A.ADJQTY,
           C.WHENOCCURRED,
           C.LPID,
           C.LOCATION,
           C.ITEM,
           C.QUANTITY,
           C.ENTQUANTITY
    FROM   A
           LEFT OUTER JOIN LATERAL (
             SELECT *
             FROM   C
             WHERE  A.LPID = C.LPID
             AND    A.whenoccurred <= c.whenoccurred
             ORDER BY c.whenoccurred
             FETCH FIRST ROW ONLY
           ) C
           ON (1 = 1) -- The join condition is inside the lateral join
    WHERE   A.facility = 'FACID'
    AND     A.WHENOCCURRED > DATE '2022-12-23'
    AND     A.ADJREASONABBREV = 'CYCLE COUNTS'
    ORDER BY A.WHENOCCURRED DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2021-10-06
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多