Возврат ближайшей даты к дате в другой таблице - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть две таблицы, одна называется События, а другая - Документы.В каждой таблице есть два столбца даты: начало и конец (т. Е. Начало события, конец события, начало документа, конец документа).Обе таблицы связаны полем с именем Customer_ID.Я заинтересован в возвращении ближайшей даты начала соответствующего события (и его идентификатора) к дате начала документа на основе идентификатора клиента, поэтому, например, данные в таблицах могут выглядеть следующим образом:

Customer_ID DOC_ID      DOC_Start   DOC_END
A           12          22/01/2011  23/01/2011
A           13          01/12/2011  05/12/2011
C           22          13/03/2011  20/03/2011


Customer_ID Event_ID    Event_Start Event_END
A           J1          01/01/2011  23/01/2011
A           J2          04/12/2011  05/12/2011
C           J44         15/03/2011  20/03/2011

IЯ хотел бы, чтобы конечный результат показал это:

Customer_ID DOC_ID  DOC_Start   DOC_END     Event_ID
A           12      22/01/2011  23/01/2011  J1
A           13      01/12/2011  05/12/2011  J2
C           22      13/03/2011  20/03/2011  J44

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

Редактировать: еще одно условие заключается в том, чтоЯ хотел бы вернуть только коррелирующие типы событий / документов.Поэтому я хочу вернуть только DOC_ID, где DOC_TYPE - «Запрос» или «Информация», и то же самое относится и к Event_Type.

Редактировать: Спасибо, Винсент, я добавил туда, где это было предложено (думаю, я пробовал это везде, но там!), И теперь я получаю требуемые результаты.

Я выложурабочее решение для дальнейшего использования, если кому-то интересно:

SELECT
*

FROM (SELECT 
O_ASSESSMENTS.ASM_SUBJECT_ID as "ID", 
O_ASSESSMENTS.ASM_ID as "Assessment ID", 
O_ASSESSMENTS.ASM_START_DATE as "Assessment Start",  
O_ASSESSMENTS.ASM_END_DATE as "Assessment End", 
O_SERVICE_EVENTS.SEV_ID as "Event ID", 
O_SERVICE_EVENTS.SEV_ACTUAL_DATE as "Event Start", 
O_SERVICE_EVENTS.SEV_OUTCOME_DATE as "Event End",
ROUND(O_ASSESSMENTS.ASM_START_DATE -O_SERVICE_EVENTS.SEV_ACTUAL_DATE,0) as "Likely",
  row_number() over(PARTITION BY  O_ASSESSMENTS.ASM_ID                                    
ORDER BY abs(O_ASSESSMENTS.ASM_START_DATE -  O_SERVICE_EVENTS.SEV_ACTUAL_DATE)) rn            
FROM 
O_ASSESSMENTS 
JOIN  O_SERVICE_EVENTS ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID
Where O_SERVICE_EVENTS.SEV_CODE IN ('t','t1') AND O_ASSESSMENTS.ASM_QSA_ID IN ('test','test1')  )  WHERE rn = 1 

Ответы [ 2 ]

8 голосов
/ 08 декабря 2011

Вы можете использовать аналитика :

SELECT *
  FROM (SELECT d.customer_id, d.doc_id, d.doc_start, d.doc_end, e.event_id,
                row_number() over(PARTITION BY d.doc_id 
                                  ORDER BY abs(d.doc_start - e.event_start)) rn
           FROM doc d
           JOIN event e ON d.customer_id = e.customer_id
        /*WHERE CLAUSE*/)
 WHERE rn = 1
0 голосов
/ 08 декабря 2011

Объединить Events и Documents и выбирать только объединенные строки с ближайшими DOC_Start и Event_Start

select D1.Customer_ID, D1.DOC_ID, D1.DOC_Start, D1.DOC_END, E1.Event_ID 
from Events E1, Documents D1
where E1.Customer_ID = D1.Customer_ID
and (D1.Customer_ID, D1.DOC_ID, E1.Event_ID) in
(
     select D2.Customer_ID, D2.DOC_ID, E2.Event_ID 
     from Events E2, Documents D2
     where E2.Customer_ID = D2.Customer_ID
     group by D2.Customer_ID, D2.DOC_ID, E2.Event_ID
     having abs(D2.DOC_Start - E2.Event_Start) = min(abs(D2.DOC_Start - E2.Event_Start))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...