2015-02-10 147 views
-2

我有这样的表。我必须找到最大日期(max_date_6)no ='000000001 001'和状态= 6。以及状态= 1的日期(max_date_1),该日期在max_date_6之后。我写这样的查询,但它只给出两个状态的最大值。但max_date_6必须是20943和MAX_DATE_1必须是21002Oracle在值后选择最大记录

WITH max_date_6 AS 
(
     SELECT no, 
        Max(DATE) date_6 
     FROM  TABLE 
     where status=6 
     AND  no='00000001 001' 
     GROUP BY no), max_date_1 AS 
(
     SELECT no, 
        max(DATE) date_1 
     FROM  TABLE 
     WHERE status=1 
     AND  no='00000001 001' 
     GROUP BY no) 
SELECT date_6, 
     date_1 
FROM max_date_6, 
     max_date_1 where date_6<=date_1 

enter image description here

+0

这听起来像你想的地位*最小*日期= 1,其中该日期比*最大*日期地位更高= 6 – 2015-02-10 14:13:08

回答

0

没有必要让这里的东西复杂化,你只需要两个MAX与情况的:

SELECT Max(case when status = 6 then DATE end) as date_6, 
     Max(case when status = 1 then DATE end) as date_1 
FROM TABLE 
where no='00000001 001' 

编辑的版本,现在需要date_1> max(date_6),表示如果没有date_1> max(date_6),则返回null,否则返回与前面相同的结果。

SELECT Max(case when status = 6 then DATE end) as date_6, 
     (select Max(DATE) 
     from TABLE 
     where status = 1 
      and no = t1.no 
      and date > (select max(date) from TABLE 
         where no = t1.no 
         and status = 6)) as date_1 
FROM TABLE t1 
where no = '00000001 001' 
+0

但它会给我只最大日期为每个status.will不? – Hasanova 2015-02-10 08:34:21

+0

是,状态= 6的最大日期和状态= 1的最大日期。是不是你要求的?如果没有,请说明你想要的确切结果! – jarlh 2015-02-10 08:36:33

+0

我想找到状态= 6的最大日期,但状态= 1我想查找max_date_6后的最大日期,不仅是最大 – Hasanova 2015-02-10 08:41:51

0

所以,如果你前面的那一行想为status=6datestatus=1最大date。 这是不可能的,除非你有一些顺序收集行。出于这个原因,我添加了列ID(也许你有一些其他的密钥,但隐藏它)。 所以输入数据是:

NO    TDATE STATUS ID 
----------------- ----- ------ -- 
00000001 001 21223  1 1 
00000001 001 21041  1 2 
00000001 001 21002  1 3 
00000001 001 20943  6 4 
00000001 001 20939  6 5 
00000001 001 20933  1 6 
00000001 001 20943  6 7 

查询和结果:

with t001 as (select * from input where no = '00000001 001'), 
t6 as (select * 
    from (select id, tdate from t001 where status = 6 
    order by tdate desc, id) 
    where rownum = 1) 
select t6.tdate max_date_6, t001.tdate max_date_1 
    from t6, t001 
    where t001.id = (
    select max(id) from t001 where status = 1 and id<t6.id) 

result: 
MAX_DATE_6 MAX_DATE_1 
---------- ---------- 
    20943  21002 
+0

我认为OP的状态= 1的最短日期大于状态= 6的日期。 – 2015-02-10 14:12:08

+0

@ David Faber在这里他写道其他:* status = 1在日期列88642,89543和72213中有三条记录。我必须找到status = 1 max_date_1 = 88642,但不是89543 *。 88642也不是最小,也不是最大。我根据主帖中的例子创建了我的答案。 *和* max_date_1 *之后的单词*令人困惑。 – 2015-02-10 14:23:44

0

鉴于你预期的数据,TT听起来像你想的最低日期状态= 1,其中该日期大于的最大日期状态= 6

WITH m6 AS (
    SELECT max(tdate) AS max_date_6 
     FROM mytable 
     WHERE status = 6 
     AND no = '00000001 001' 
) 
SELECT min(m1.tdate) AS max_date_1, m6.max_date_6 
    FROM mytable m1, m6 
WHERE m1.status = 1 
    AND m1.no = '00000001 001' 
    AND m1.tdate > m6.max_date_6; 

可替换地:

WITH m6 AS (
    SELECT no, max(tdate) AS max_date_6 
     FROM mytable 
     WHERE status = 6 
     GROUP BY no 
) 
SELECT min(m1.tdate) AS max_date_1, m6.max_date_6 
    FROM mytable m1 INNER JOIN m6 
    ON m1.no = m6.no 
    AND m1.tdate > m6.max_date_6 
WHERE m1.status = 1 
    AND m1.no = '00000001 001';