2013-10-03 2 views
1

У меня есть таблица событий, в которой отображаются даты и участники событий, но клиент теперь хочет видеть названия участников во время события. У меня есть таблица аудита, которая показывает изменения в заголовке и даты, когда произошло изменение, но я не уверен, как выполнить инструкцию SQL, которая найдет заголовок, дата которого меньше даты события, но больше, чем предыдущие изменения названия ,Oracle SQL для определения ближайшей даты меньше даты события

Пример:

В audit таблице у меня есть:

name1, title1, 1/23/2011 
name1, title2, 2/1/2012 
name1, title3, 3/1/2013 

В event таблице у меня есть

event1, name1, 3/2/2012 
event2, name1, 1/30/2011 
event3, name1, 6/3/2013 
event4, name1, 5/3/2012 

Результат Я хочу это:

event1, name1, title2 -- (event date > 2/1/2012 (title2 date) but < 3/1/2013 (title3 date) 
event2, name1, title1 -- (event date > 1/23/2011 but < other title dates) 
event3, name1, title3 -- (event date > highest title date) 
event4, name1, title2 -- (same as first example above) 

Можно ли использовать только SQL или pl/sql?

ответ

0

Попробуйте это:

CREATE TABLE audit_tab (name VARCHAR2(20), title VARCHAR2(20), title_date DATE); 
CREATE TABLE event (event_name VARCHAR2(20), person_name VARCHAR2(20), event_date DATE); 

INSERT INTO audit_tab VALUES ('name1', 'title1', TO_DATE('01-23-2011', 'MM-DD-YYYY')); 
INSERT INTO audit_tab VALUES ('name1', 'title2', TO_DATE('02-01-2012', 'MM-DD-YYYY')); 
INSERT INTO audit_tab VALUES ('name1', 'title3', TO_DATE('03-01-2013', 'MM-DD-YYYY')); 

INSERT INTO event VALUES ('event1', 'name1', TO_DATE('03-02-2012', 'MM-DD-YYYY')); 
INSERT INTO event VALUES ('event2', 'name1', TO_DATE('01-30-2011', 'MM-DD-YYYY')); 
INSERT INTO event VALUES ('event3', 'name1', TO_DATE('06-03-2013', 'MM-DD-YYYY')); 
INSERT INTO event VALUES ('event4', 'name1', TO_DATE('05-03-2012', 'MM-DD-YYYY')); 

SELECT e.event_name, e.person_name, a.title 
    FROM event e, audit_tab a 
WHERE e.person_name = a.name 
    AND e.event_date >= a.title_date 
    AND NOT EXISTS (SELECT 1 
        FROM audit_tab 
        WHERE name = a.name 
        AND title != a.title 
        AND title_date > a.title_date 
        AND title_date <= e.event_date) 
ORDER BY e.event_name 
; 

Проверьте это на SQLFiddle: http://sqlfiddle.com/#!4/a9814a/1

0

Что-то, как это должно работать:

SELECT e.event, a.name, a.title 
FROM audit a 
JOIN event e ON a.name=e.name 
WHERE a.date = (SELECT MAX(e.date) FROM audit a1 WHERE a.name = a1.name AND 
     a1.date <= e.date) 
ORDER BY e.event; 
+0

Это работает, когда вы получаете e скобки вправо. Проверено на моих таблицах: SELECT e.event_name, a.name, a.title FROM audit_tab a JOIN event e ON a.name = e.person_name WHERE a.title_date = (SELECT MAX (a.title_date) FROM audit_tab a WHERE a.title_date <= e.event_date); –

+0

@Przemyslaw Kruglej - Спасибо за тестирование. Я должен быть слеп, но я не вижу ничего плохого в своих скобках. Что мне не хватает? –

+0

Вам не хватает скобки перед ключевым словом SELECT :) она есть, но сразу после нее. –

0

Это должно работать нормально:

CREATE TABLE T_AUDIT(NAME VARCHAR2(100), TITLE VARCHAR2(100), ADATE DATE); 
CREATE TABLE T_EVENT(EVENT VARCHAR2(100), NAME VARCHAR2(100), EDATE DATE); 

SELECT te.event, te.name, ta.title FROM T_AUDIT ta INNER JOIN T_EVENT te ON ta.name = te.name 
WHERE ta.adate = (SELECT MAX(ta1.adate) FROM T_AUDIT ta1 
        WHERE ta1.name = te.name 
         AND ta1.adate < te.edate) 
Смежные вопросы