2015-03-25 3 views
0

У меня есть таблица оракула, которая имеет эти два столбца, CreateDate и FlagId, среди прочих. FlagID - целочисленный столбец. Я должен сначала извлечь все строки с FlagID в (3000, 3001, 3002). Я сделаю инструкцию select, где FlagID в (3000, 3001, 3002) порядке CreateDate, FlagID desc. Теперь у меня будет множество наборов из этих трех строк. Я должен выбрать последний набор значений. Однако это не всегда может быть три. Это могут быть (3001, 3002), (3000, 3001, 3002) и так далее. В этом случае я должен выбрать первые две строки, опускающие последующие множества. Если в верхних строках есть все три флага, я должен получить три строки. Я создал указатель оракула и получил все строки, выбранные этими значениями, по порядку CreateDate. Но я не уверен, как выбрать верхний набор строк, создав подмножество из курсора.Как создать подмножество курсора оракула

ответ

0

Это возвратит все строки новее, чем предпоследняя дата для FlagId 3000.

Oracle:

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

+0

Итак, вам нужно последнее из каждого из трех значений? Как они могут быть набором, если они не используют одну и ту же дату? –

+0

Это немного сложнее. Сначала мне нужно получить последние 3000, а затем все 3001 0r 3002 до того, как встретится еще 3000, упорядочите по дате. – user466663

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 
Смежные вопросы