2012-01-12 35 views
1

我不太确定这个特定查询的最佳表达方式,所以我希望标题是足够的,但是,我会尝试描述它是什么,我需要能够了解如何去做。只是为了澄清,这是针对oracle的sql。根据标准拆分一张表并比较

我们有一张名为评估表。本表中有不同类型的评估,但是,一些评估应按照逻辑顺序并在规定的时间范围内跟随其他评估。当客户有相同类型的多个评估时,问题就出现了,因为我们必须在Excel中使用相当低效的数组公式来确定哪个“完整”评估与“初始”评估相一致。

我有一个较早的查询已解决在这个网站上(Returning relevant date from multiple tables including additional table info),我相信它包含了很多逻辑(特别是在识别在指定时间范围内发生的相应事件)。但是,虽然该查询从3个独立表(评估,事件,责任)中提取数据,但我现在需要创建一个查询,该查询生成类似的结果,但从1个主表和第2个表中提取返回工作人员信息。我认为最合乎逻辑的方法是创建一个查询,用一种类型的评估来查看评估表,然后再次加入评估表(可能是临时表),评估类型将遵循最初的评估类型。

例如:

表1(评估):(?评估温度)

Client ID Assessment Type Start  End 
P1  1  Initial   01/01/2012 05/01/2012 

表2:

Client ID Assessment Type Start  End 
P1  2  Full    12/01/2012 

表3:

ID  Worker  Team 
1  Bob  Team1 
2  Lyn  Team2 

结果:

Client ID Initial Start Initial End Initial Worker Full Start Full End 
P1  1  01/01/2012  05/01/2012  Bob    12/01/2012 

所以表1和表2从同一张表中抽出,除了它带来了不同的评估。理想情况下,应该进行检查以确保在“初始”评估结束后X天内开始“全面”评估(类似于之前提到的前面查询中的“可能”检查)。如果可以实现这一点,那么可能值得一提的是,我也有兴趣扩大这个范围,以考虑多种评估类型,大致在这个周期中,客户可能会有4到5种不同类型的评估。任何指针将不胜感激,我已经从这个社区有很大的帮助,这是非常有价值的。

编辑:

编辑为包括MBs建议后的解决方案。

Select 
* 
From(
Select 
I.ASM_SUBJECT_ID as PNo, 
I.ASM_ID As IAID, 
I.ASM_QSA_ID as IAType, 
I.ASM_START_DATE as IAStart, 
I.ASM_END_DATE as IAEnd, 
nvl(olm_bo.get_ref_desc(I.ASM_OUTCOME,'ASM_OUTCOME'),'') as IAOutcome, 
C.ASM_ID as CAID, 
C.ASM_QSA_ID as CAType, 
C.ASM_START_DATE as CAStart, 
C.ASM_END_DATE as CAEnd, 
nvl(olm_bo.get_ref_desc(C.ASM_OUTCOME,'ASM_OUTCOME'),'') as CAOutcome, 
ROUND(C.ASM_START_DATE -I.ASM_START_DATE,0) as "Likely", 
row_number() over(PARTITION BY I.ASM_ID     
ORDER BY 
abs(I.ASM_START_DATE - C.ASM_START_DATE))as "Row Number" 
FROM 
O_ASSESSMENTS I 
left join O_ASSESSMENTS C 
on I.ASM_SUBJECT_ID = C.ASM_SUBJECT_ID 
and C.ASM_QSA_ID IN ('AA523','AA1326') and 
ROUND(C.ASM_START_DATE - I.ASM_START_DATE,0) >= -2 
AND 
ROUND(C.ASM_START_DATE - I.ASM_START_DATE,0) <= 25 
and C.ASM_OUTCOME <>'ABANDON' 
Where I.ASM_QSA_ID IN ('AA501','AA1323') 
AND I.ASM_OUTCOME <> 'ABANDON' 
AND 
I.ASM_END_DATE >= '01-04-2011') WHERE "Row Number" = 1 
+0

找到完整的开始的条件是什么?在您的示例中没有匹配表格的字段? – Mark 2012-01-12 16:41:35

+0

对不起,在评估表中应该有一个客户端ID用于将评估链接在一起,但是它也将依赖于在初始结束和核心开始之间有一定的天数 - 即不超过+/- 20天的差距。 – bawpie 2012-01-12 16:52:16

回答

3

您可以多次访问同一个表中给定的查询在SQL,只需通过使用表的别名。因此,这样做的一个方法是:

select i.client, 
     i.id  initial_id, 
     i.start initial_start, 
     i.end initial_end, 
     w.worker initial_worker, 
     f.id  full_id, 
     f.start full_start, 
     f.end full_end 
from assessments i 
join workers w on i.id = w.id 
left join assessments f 
     on i.client = f.client and 
      f.assessment_type = 'Full' and 
      f.start between i.end and i.end + X 
/* replace X with appropriate number of days */ 
where i.assessment_type = 'Initial' 

注:列名,如end(即保留在甲骨文SQL字)一般应加双引号,但是从前面的问题看起来好像这些都是实际列名的简化版本。

+0

谢谢,这是有道理的,我已经能够将它与我以前的查询集成在一起。我认为这将是沿着这些路线的东西,但不太明白如何 - 现在我做,所以谢谢你! – bawpie 2012-01-13 09:40:57

1

从你的文章中,我假设你在这里使用Oracle(因为我在问题中看到“Oracle”)。

就“临时”表而言,视图是正确的。 Oracle视图可以为您提供不同的表格外观,这听起来就像您正在寻找不同类型的评估。

唐伯利森是什么一个很好的来源甲骨文有关,他给出了甲骨文查看一些提示在http://www.dba-oracle.com/concepts/views.htm

+0

谢谢,我会看看这个,看看我能不能找到它! – bawpie 2012-01-12 16:52:33