2015-02-10 141 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';