在不同的表中返回最近的日期
Posted
技术标签:
【中文标题】在不同的表中返回最近的日期【英文标题】:Returning nearest date to date in a different table 【发布时间】:2011-12-08 15:35:34 【问题描述】:我有两张表,一张称为事件,一张称为文档。每个表有两个日期列,开始和结束(因此事件开始、事件结束、文档开始、文档结束)。两个表都由一个名为 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
我尝试在谷歌上搜索解决方案,并尝试了一两个建议,但我能找到的示例似乎都不是用于比较表之间的日期,甚至是用于 Oracle 的。另外,我在 SQL 方面的知识相当有限,但我学到的大部分知识都来自这里,所以已经感谢我已经收到的帮助。
编辑:另一个条件是我只想返回相关的事件/文档类型。所以我只想带回 DOC_ID,其中 DOC_TYPE 是“查询”或“信息”,Event_Type 也是如此。
编辑:谢谢文森特,我按照建议输入了 where(我想我已经在任何地方都试过了!)现在我得到了所需的结果。
如果有人感兴趣,我会发布工作解决方案以供将来参考:
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
【问题讨论】:
event_start
日期可以在DOC_start
状态之前出现并且仍然被认为是最接近的吗?还是event_start
总是要迟一点?
【参考方案1】:
你可以使用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
【讨论】:
谢谢,这似乎产生了一些结果,但我需要添加一个进一步的条件 - 在文档表上,我只对某种文档类型感兴趣,同样适用事件表。我没有将其包含在原始查询中,因为我认为我可以调整结果代码,但是当我尝试在查询中添加 where 时,我遇到了错误......我会更新要详细说明的原始查询。 您可以在内部查询中添加 where 子句,请参阅我更新后的查询 感谢文森特,看来这可以解决问题。非常感谢!【参考方案2】:加入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))
);
【讨论】:
感谢您发布此信息,不幸的是,我在使其工作时遇到了一些麻烦,但我怀疑这更多地与我有限的 SQL 知识有关,而不是查询的任何问题。谢谢!以上是关于在不同的表中返回最近的日期的主要内容,如果未能解决你的问题,请参考以下文章