2016-08-15 81 views
0

我对查询有一些麻烦。该查询用于获取Article Nr。和修改日期。之后我们生成一份报告。直到现在,它工作得很好。Oracle查询 - 上次更新日期多个项目

对于每个产品将有4个日期的阶段。 不幸的是在数据库中有时会超过4个阶段。在某些情况下,产品会通过两次处理。这意味着有8个日期的8个阶段。 什么,我试图让:

  • 的列表,包括一些产品
  • 最新阶段(最年轻的日期)
  • 忽略,如果退出历史最悠久的生产步骤

这是我的代码, (我创建伪代码

我试图混合Artikel号码和日期(concat())。 获取一个唯一的字符串。
但它不能很好地工作(高处理时间)。

SELECT 
    * 
FROM 
    (
    SELECT 
     /* Some Calculations & Cases and Critera */ 
    FROM 
     ( 
     SELECT 
      /* Get the Product Columns */ 
      ArtNumber, 
      modDate, 
      weight 
     FROM 
      /* four different Tables */ 
     WHERE 
      /* Criterialist to get the Products */ 
      modDate>sysdate -360 
      /* what i think, that can solve the Problem */ 
     AND CONCAT(ArtNumber, modDate) IN 
      ( 
      SELECT DISTINCT 
       ArtNumber 
      FROM 
      WHERE 
       ( 
       stateentrytime >sysdate - 13 
       AND stateentrytime<sysdate - 5 
      ) 
       ( 
       SELECT 
        MAX(modTime) AS highestDate, 
        ArtNumber, 
        CONCAT (ArtNumber, modTime) AS ArtMod 
       FROM 
       WHERE 
        /* Criterialist to get the Products */ 
       AND ArtNumber IN 
        ( 
        SELECT 
         ArtNumber 
        FROM 
        WHERE 
         modTime>sysdate -360 
        GROUP BY 
         h.ArtNumber 
       ) 
       GROUP BY 
        h.ArtNumber, 
        CONCAT (ArtNumber, modTime) 
      ) 
     ) 
    ) 
     ftd , 
    WHERE 
     /* Criterialist to get the Products */ 
) 
WHERE 
    /* more Criteria */  

你有什么提示吗? 为

  1. 获得创建ModDate
  2. 优化查询

我期待什么:

ArtNumber | modTime 
--------- | ------- 
12345  | 23.08.2016 
12346  | 20.07.2016 
12347  | 23.05.2016 
12348  | 23.03.2016 
  • 一个日期为一个项目

我得到什么:

ArtNumber | modTime 
--------- | ------- 
12345  | 23.08.2016 
12346  | 20.07.2016 
12345  | 23.05.2016 
12346  | 23.03.2016 
  • 同一项目编号
  • 不同日期

的问题是,当我试图让MAX。我只拿到具有最高日期的项目。

非常感谢菲尔

+0

欢迎堆栈溢出。您的查询不具有远程可读性。你可以请修复格式? –

+1

你说每个项目有四个阶段。 (我想像计划中的东西 - >订购 - >库存 - >售完,或者按照这些行列出的东西)。但是,您想要展示的每件产品都是最后一个阶段的日期?你甚至不想看到它在哪个阶段?这不是简单的'选择artnumber,max(stateentrytime)从...哪里...按artnumber'分组? –

回答

0

您想汇总数据。您正在寻找MAX(modtime)artnumber。这转换为MAX(modtime) ... GROUP BY artnumber。 (如果没有GROUP BY你得到的只是一排聚集所有 recods。)

因此:

select artnumber, max(modtime) as modtime 
from ... 
where ... 
group by artnumber 
order by artnumber;