如果我理解正确的话,你会得到一系列类似于以下形式的数据:
Section 1, Phase 7, Start Date = 11/07/2012
Section 1, Phase 2, Start Date = 12/14/2012
Section 1, Phase 3, Start Date = 12/28/2012
Section 2, Phase 1, Start Date = 11/04/2012
Section 2, Phase 9, Start Date = 12/30/2012
Section 3, Phase 4, Start Date = 11/19/2012
Section 3, Phase 5, Start Date = 12/06/2012
Section 3, Phase 3, Start Date = 12/11/2012
您想回答“2012 年 12 月 15 日每个部分处于哪个阶段?”这样的问题,对吗?
这种情况下的答案应该类似于以下形式:
Section 1, Phase 2
Section 2, Phase 1
Section 3, Phase 3
为了做到这一点,我假设您有一个名为 SECTION_PHASES 的表,其中包含以下字段:
SECTION Number
PHASE Number
START_DATE Date/Time
您需要做的是找出当前输入日期之前发生的每个部分的最大开始日期,因为这是下一个阶段更改之前的最近活动阶段。完成此操作后,您可以将该信息连接回主表中,以确定该日期之后的阶段。
您需要进行一个查询 SECTION_MAX_DATES,然后在其 SQL 视图中包含以下代码:
SELECT [SECTION_PHASES].SECTION, Max([SECTION_PHASES].START_DATE) AS target_date
FROM SECTION_PHASES
WHERE [SECTION_PHASES].START_DATE<#12/15/2012#
GROUP BY [SECTION_PHASES].SECTION
ORDER BY [SECTION_PHASES].SECTION;
保存该查询后,您可以将其作为子查询连接回原始表。现在,创建另一个查询 SECTION_PHASE_AT_DATE,其中包括原始表和上一个查询,然后在其 SQL 视图中输入以下代码:
SELECT SECTION_PHASES.SECTION, SECTION_PHASES.PHASE, SECTION_PHASES.START_DATE
FROM SECTION_MAX_DATES INNER JOIN SECTION_PHASES ON (SECTION_MAX_DATES.target_date=SECTION_PHASES.START_DATE) AND (SECTION_MAX_DATES.SECTION=SECTION_PHASES.SECTION)
ORDER BY SECTION_PHASES.SECTION;
如果我正确理解你的问题,该查询将为你提供你想要的结果。如果我正确理解您的意思,即给定阶段的新开始日期表示新日期之前的任何阶段的结束,则无需计算结束日期。
您仍然需要解决一些边缘情况,例如如果某个部分在给定日期之前尚未注册阶段会发生什么情况。我还将让您弄清楚如何参数化两个查询中第一个查询的 WHERE 子句中的日期,考虑到您已经取得的进展,这对您来说可能是微不足道的!但是,我认为这是您正在寻找的用于解决问题的数据/计算部分的 SQL 结构。