SQL - 参考表具有基于日期的信息

时间:2012-06-25 23:55:57

标签: sql-server

所以我有一个存储主键,描述和更新日期列的引用表。像这样的东西

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上,但我必须知道每个参考代码的开始和结束日期。有一个简单的解决方案吗?

2 个答案:

答案 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

请记住,您需要简单的代码和模型。