0

我试图查询的 oracle 表有多个日期列,这些列提供仓库活动的时间戳,包括与之关联的项目和位置。

我正在尝试查找在某个日期位于某个位置的项目。该位置的活动时间戳(例如添加更多产品、更换新产品、计数等)列出了该项目。我正在查找日期的最大值,因为它低于某个目标,以便找到在时间戳和我的目标日期时间内最后记录在那里的项目。我对此的查询如下:

SELECT ITEM,LOCATION,ANVDATE FROM PLATEHISTORY WHERE ANVDATE = (SELECT MAX(ANVDATE) FROM PLATEHISTORY WHERE ANVDATE <= ('3-Jan-18') AND LOCATION in ('4446D01')) AND LOCATION in ('4446D01');

这一切都很好,但是第二列 WHENOCCURRED 也有我想要的时间戳,它们不匹配。在 WHENOCCURRED 中可能发生了具有不同项目的较新活动,但未显示在 ANVDATE 中,在这种情况下,如果我查询 ANVDATE,我将获得有关该位置项目的虚假信息。

这是我的意思的简要说明:

   LOCATION  ITEM        ANVDATE      WHENOCCURRED
    4446D01  MK0C2AM/A  02-JAN-18   06-FEB-18
    4446D01  MP812LL/A  14-DEC-17   31-DEC-17
    4446D01  MP812LL/A  14-DEC-17   18-DEC-17
    4446D01  MP812LL/A  14-DEC-17   26-DEC-17
    4446D01  MK0C2AM/A  02-JAN-18   08-JAN-18

如您所见,我正在寻找项目“MK0C2AM/A”,但它必须通过 18 年 1 月 3 日之前的日期返回,因此尝试在 ANVDATE 和 WHENOCCURRED 之间进行 CASE 比较以获得更大的删除实际包含我想要的项目的条目。

如何在目标时间之前检查 ANVDATE 和 WHENOCCURRED 的最新更新,只选择最接近的更新,并从中获取 ITEM 和 LOCATION?

4

1 回答 1

0
SQL> create table t ( ANVDATE date , WHENOCCURRED date , location varchar2(10), PLATEHISTORY int);

Table created.

SQL>
SQL> select *
  2  from (
  3    SELECT x.*, least(x.ANVDATE,x.WHENOCCURRED) dt
  4    FROM
  5    ( select t.*,
  6             row_number() over ( order by ANVDATE ) as r1,
  7             row_number() over ( order by WHENOCCURRED ) as r2
  8      from   t
  9      WHERE  LOCATION in ('4446D01')
 10    ) x
 11    where r1 = 1 or r2 = 2
 12    order by dt
 13  )
 14  where rownum = 1;

应该让你去。

于 2018-02-07T02:45:54.970 回答