2011-12-08 38 views
2

我有两个表,一个叫做Events,一个叫做Documents。每个表格有两个日期列,开始和结束(所以事件开始,事件结束,文档开始,文档结束)。两个表都通过名为Customer_ID的字段进行链接。我感兴趣的是返回最接近的相关事件开始(和它的ID),根据客户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 

我会想最终的结果显示如下:

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 

我试着用搜索引擎的解决方案,并尝试一项两个建议,但没有一个例子,我可以找到似乎是跨表,甚至是比较日期甲骨文。另外,在SQL方面,我的知识相当有限,但大部分我已经从这里获得,所以非常感谢我已经收到的帮助。

编辑:另一个条件是我想只返回相关的事件/文档类型。因此,我只想将DOC_TYPE为“Inquiry”或“Info”的DOC_ID取回,对于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 
+0

'event_start'日期是否可以在'DOC_start'状态之前出现,仍然被认为是最接近的?或者'event_start'总是要迟些? – ean5533

+0

是的,它可以。 :) – bawpie

回答

8

您可以使用analytics

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

谢谢,这似乎是产生一些结果,但我需要添加进一步的条件 - 在文档表上,我只对某种文档类型感兴趣,事件表也是如此。我没有在原始查询中包括这个,因为我认为我可以调整结果代码,但是当我尝试向查询中添加一个位置时,出现错误...我将更新原始查询进行排序。 – bawpie

+0

您可以在内部查询中添加where子句,请参阅我的更新查询 –

+0

感谢Vincent,它看起来像是在捣蛋。非常感谢! – bawpie

0

加入EventsDocuments,只选择最接近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)) 
); 
+0

感谢您发布此信息,不幸的是,我在收到此信息时遇到了一些问题,但我怀疑这与使用有限的SQL知识有关,而不是与查询有关的任何问题。谢谢! – bawpie

相关问题