SQL - 选择最新的日期'孩子'记录

时间:2014-07-20 12:00:25

标签: sql sql-server-2005

我正在寻找一个SQL查询来查找父记录值以及其多个子记录中的最新日期时间值。我设想在join子句中使用SELECT TOP 1的解决方案,但我有点难过如何做到这一点。

以下是简化版。我已经寻求了这方面的帮助,但由于父记录和子记录存储在同一个表中,但是使用另一个表来链接它们,我很难找到问题的答案。

我有一个 [Case] 表,用于存储两种类型的真实事件的数据:引荐访问

一个推介多次访问相关联。

将它们“链接”在一起的数据存储在名为 EventCaseAutoCreate

的表中
Case table (Referrals and Visits)
------------------------
CaseNo uniqueidentifier,
ActiveDate datetime,
CaseType varchar       (Visit or Referral)


EventCaseAutoCreate table
------------------------
EventCaseAutoCreateRef uniqueidentifier,
CaseNo               (Visit [case] table caseref value)
OriginalCaseNo       (Referral [case] table caseref value)

因为Case表包含Referral和Visit行,[case] .activedate是'Referral Date'或'Visit Date',具体取决于CaseType。

所以你有以下内容:

Case
CaseNo    ActiveDate    CaseType
10000     01/07/2014    Referral
10001     02/07/2014    Visit
10005     05/07/2014    Referral
10002     07/07/2014    Visit
10003     08/07/2014    Visit
10004     20/07/2014    Visit
10006     06/07/2014    Visit

EventCaseAutoCreate
EventCaseAutoCreateRef    CaseNo    OriginalCaseNo
GUID                      10001     10000
GUID                      10002     10000
GUID                      10003     10000   
GUID                      10004     10000
GUID                      10006     10005 

我想知道查询以获得以下结果:

ReferralCaseNo    ReferralDate    LatestVisitDate
10000             01/07/2014      20/07/2014
10005             05/07/2014      06/07/2014

我正在使用SQL Server 2005.非常感谢。

2 个答案:

答案 0 :(得分:2)

这是我的抨击:

select a.caseno as ReferralCaseNo, c1.ActiveDate as ReferralDate, b.maxdate as LatestVisitDate 
from cases c1 inner join 
(
   select distinct e.originalcaseno as caseno
   from cases c inner join events e on c.caseno = e.caseno
)a on c1.caseno = a.caseno
inner join 
(
   select max(ActiveDate) as maxdate, e2.originalcaseno
   from cases c2 inner join events e2
     on c2.caseno = e2.caseno
   group by e2.originalcaseno
 ) b on a.caseno = b.originalcaseno

Demo Here

答案 1 :(得分:1)

我认为您只需在EventCaseAuteCreate表中查找原始案例编号,然后进行条件汇总:

select OriginalCaseNo as ReferralCaseNo,
       min(case when casetype = 'Referral' then ActiveDate end) as ReferralDate,
       max(case when casetype = 'Visit' then ActiveDate end) as LatestVisitDate
from cases c join
     EventCaseAutoCreate eac
     on c.caseno = eac.caseno or
        c.caseno = eac.OriginalCaseNo
group by eac.OriginalCaseNo;