所以我有一个存储主键,描述和更新日期列的引用表。像这样的东西
SELECT * FROM tblReasonRef
ReasonCode Description UpdateDate
27 Lunch 2010-12-01
24 Meeting 2010-12-01
20 SpecialProj 2010-12-01
前几天,代码说明已更改。所以现在查询返回以下内容......
ReasonCode Description UpdateDate
27 Lunch 2010-12-01
24 Meeting 2010-12-01
20 SpecialProj 2010-12-01
27 Training 2012-06-22
24 Meeting 2012-06-22
20 Lunch 2012-06-22
源数据每30分钟跟踪一名工作人员可能进入的状态,因此您将获得以下查询......
SELECT * FROM tblhActivity
MemberID Date Time ReasonCode ReasonDuration
10922 2012-06-21 1200 27 100
10922 2012-06-21 1500 24 1800
10922 2012-06-25 1230 27 100
最初,我的查询是......
SELECT a.MemberID, a.Date, a.Time, r.Description, a.ReasonDuration
FROM tblhActivity a
INNER JOIN tblReasonRef r ON a.ReasonCode = r.ReasonCode
直到22日发生变化才合适。现在我对每个代码有两个定义。问题是,如何创建一个将根据日期选择正确代码的查询。
例如,我知道当日期是21日时,代码27的描述应该是午餐。在25日,返回的描述应该是Training。
请记住,这可能会再次发生在代码添加到参考表的地方。我试图认为连接也应该在UpdateDate上,但我必须知道每个参考代码的开始和结束日期。有一个简单的解决方案吗?
答案 0 :(得分:1)
您确实需要特定原因适用期间的开始日期和结束日期。您可以修改tblReasonRef
以包含这些日期(最佳选项),也可以计算它们。
以下查询将计算每个原因的结束日期,作为添加ReasonCode
的新条目的前一天。
SELECT ReasonCode
,Description
,UpdateDate StartDate
,DATEADD(d, -1, UpdateDate) PreviousEntryEndDate
,ROW_NUMBER() OVER(PARTITION BY ReasonCode ORDER BY UpdateDate) AS Row
INTO #reason
FROM tblReasonRef
SELECT a.MemberID
,a.Date
,a.Time
,reason.ReasonCode
,a.ReasonDuration
FROM tblhActivity a
INNER JOIN #reason reason
ON a.ReasonCode = reason.ReasonCode
LEFT JOIN #reason nextReason
ON reason.Row = nextReason.Row - 1
AND reason.ReasonCode = nextReason.ReasonCode
WHERE a.Date BETWEEN reason.StartDate AND ISNULL(nextReason.PreviousEntryEndDate, a.Date)
DROP TABLE #reason
答案 1 :(得分:0)
如果您修改表格 tblReasonRef ,请执行以下操作:
ReasonCode, Description, StarDate, EndDate
你可以这样做SQL Query:
SELECT a.MemberID, a.Date, a.Time, r.Description, a.ReasonDuration
FROM tblhActivity a
INNER JOIN tblReasonRef r ON a.ReasonCode = r.ReasonCode
WHERE a.Date between r.StartDate and r.EndDate
请记住,您需要简单的代码和模型。