我有两个表,一个称为“事件”,一个称为“文档”。每个表都有两个日期列,开始和结束(因此,事件开始,事件结束,文档开始,文档结束)。这两个表通过名为Customer_ID的字段链接。我有兴趣根据客户ID将最接近的相关事件开始(及其ID)日期返回到Doc开始日期,因此表中的数据如下所示:
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_TYPE为“查询”或“信息”的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
您可以使用分析:
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
问题内容: 我有以下postgresql语法,该语法返回WHERE session_date与$ date_string匹配的值 问题是有时$ date_string在表中不可用,所以我想返回最接近$ date_string的日期。 有什么想法可以做到这一点吗? 问题答案: 如果您想要最近的日期,请按照以下方式进行操作: 之后的最接近日期使用类似的逻辑。 对于最接近的一方:
问题内容: 我有一个要尝试编写的sqlite查询。我有两个表: TableA(销售):ID销售日期 TableB(目标):ID目标日期 我从这样的TableA中进行选择:SELECT id,sales,date from TableA 现在到“棘手的”部分。我需要将TableB加入查询中,因为我需要TableA中 每一行的 TableB中的目标字段。 TableB仅包含某些日期的目标 ,而 Tab
我有这张桌子。 我想选择按id分组的最大日期,并将NULL作为最大值包含在结果中,以获得类似结果。 我找到了一个解决方案,但它不包括NULL作为最大值,该解决方案通过@bluefeet返回特定id在最大日期的值 我还搜索了一个解决方案,看看我们如何在t-sql中选择NULL最大值,所以我通过@Damien_The_Unbeliever找到了这个解决方案如何在MIN或MAX中包含空值? 但我陷入了困
问题内容: 我有一个带有时间戳字段的表。如何获得最近3个月的数据? 特别是,三月是我当前的月份,请说 03/2012 。我只需要返回3月,2月和1月的记录。 问题答案: 今天前3个月: 从第一个月开始:
问题内容: 我有一个日期对象列表和一个目标日期。我想在列表中找到最接近目标日期的日期,但仅找到目标日期之前的日期。 示例:2008-10-1 2008-10-2 2008-10-4 目标日期为2008-10-3,我想获得2008-10-2 最好的方法是什么? 问题答案: Sietse de Kaper解决方案采用了 反向 排序的列表,绝对不是最自然的解决方案 Java中的自然排序顺序遵循递增的自然
问题内容: 这是我的SQL Server表 这似乎很容易做到,但我不知道为什么会被卡住。我只想为每个id选择max(date)和该max(date)处的值。我想忽略相对于每个ID而言不是max(date)的所有其他日期。 这是我希望表格看起来像的样子: 我尝试通过使用max(date)进行分组,但没有进行任何分组。我不确定自己在做什么错。在此先感谢您的帮助! 问题答案: 您可以使用以下内容: 观看