2015-03-25 36 views
0

我有一個oracle表,其中有這兩列,CreateDate和FlagId等等。 FlagID是一個整數列。我必須首先在(3000,3001,3002)中提取FlagID中的所有行。我將通過CreateDate,FlagID desc來執行select(3000,3001,3002)中的FlagID。現在,我將擁有這三列中的許多組。我必須選擇最新的一組值。但是,它可能不總是三個。它可以是(3001,3002),(3000,3001,3002)等等。在這種情況下,我必須選擇省略後續設置的前兩行。如果頂行有三個標誌,那麼我必須檢索三行。我已經創建了一個Oracle遊標,並通過CreateDate按照這些值順序選擇了所有行。但我不確定如何通過從光標創建子集來選擇最上面的一組行。如何創建一個oracle遊標的子集

回答

0

這將返回所有行新的比對FlagId 3000

甲骨文倒數第二日:

SELECT CreateDate, FlagId 
    FROM tab 
WHERE FlagId in (3000, 3001, 3002) and 
CreateDate > (SELECT MIN (CreateDate) 
         FROM (SELECT CreateDate 
           FROM ( SELECT CreateDate 
             FROM tab 
             WHERE FlagId = 3000 
            ORDER BY CreateDate DESC) 
           WHERE ROWNUM < 3)); 

MySQL的:

select CreateDate, FlagId from t1 
where FlagId in (3000, 3001, 3002) and 
CreateDate > 
(select min(CreateDate) from (
select CreateDate from t1 
where FlagId = 3000 
order by CreateDate desc 
limit 2) sub); 
+0

如果每個組都會有一個日期,那麼您的解決方案將是非常非常優雅。不過他們會有不同的日期。 – user466663 2015-03-25 03:49:35

+0

所以你需要三個值中的每一個的最新值?如果他們不分享同一日期,他們怎麼能成爲一個集合? – 2015-03-25 03:56:11

+0

它稍微複雜一點。首先,我必須獲得最新的3000,然後在遇到另一個3000之前獲取3001或3002,按日期排序。 – user466663 2015-03-25 04:10:56

0

在這裏,我用分層查詢做到這一點。第一部分按順序枚舉數據:createdate desc, flagid。 第二部分按此順序排列前三行。本質在連接條款:prior fid < fid and rn = prior rn + 1

with enum as (
    select createdate cd, flagid fid, row_number() 
     over (order by createdate desc, flagid) rn 
    from t where flagid in (3000, 3001, 3002)) 
select cd, fid from enum where rn <= 3 
    connect by prior fid < fid and rn = prior rn + 1 
    start with rn = 1 

樣品的輸入和輸出:

CREATEDATE   FLAGID   CD     FID 
------------------- ------   ------------------- ---- 
2015-03-24 11:48:29 3000   2015-03-25 12:24:52 3000 
2015-03-24 11:48:29 3001   2015-03-25 11:49:13 3001 
2015-03-24 11:48:29 3002   2015-03-25 11:49:13 3002 
2015-03-25 11:48:45 3000 
2015-03-25 11:48:45 3001 
2015-03-25 11:49:13 3001 
2015-03-25 11:49:13 3002 
2015-03-25 12:24:52 3000