(relational) database performance for a date/time point/interval

前端 未结 1 1371
天命终不由人
天命终不由人 2021-02-09 00:10

So I am doing a project in Access SQL and it has come along nicely. I have learned a lot about Access and VBA and this site has been helpful in the process.

Now I am fac

1条回答
  •  星月不相逢
    2021-02-09 00:38

    If I understand you properly, you have a series of data similar to the form:

    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
    

    and you want to answer a question like "What phase is each section in on 12/15/2012?", is that correct?

    The answer in this case should look something like the form:

    Section 1, Phase 2
    Section 2, Phase 1
    Section 3, Phase 3
    

    In order to do this, I'll assume you have a table called SECTION_PHASES with the following fields:

    SECTION    Number
    PHASE      Number
    START_DATE Date/Time
    

    What you need to do is figure out the maximum start date for each section that happened before your current input date, because that is the most recently active phase before the next phase change. Once you do that, you can join that information back into your main table to determine what the phase was after that date.

    You need to make one query SECTION_MAX_DATES that then has the following code in its SQL View:

    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;
    

    Once you have that query saved, you can join it as a subquery back to your original table. Now, make another query SECTION_PHASE_AT_DATE which includes your original table and the previous query, then enter the following code in its SQL View:

    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;
    

    That query will give you the result you are after, if I understand your question correctly. There is no need to calculate the end dates if I understand you properly that a new start date for a given phase indicates the end of whatever phase was previously-current prior to the new date.

    You'll still have a few edge cases to work out, like what happens if a section doesn't have a phase registered yet prior to the given date. I'll also leave it to you to figure out how to parameterize the date in the WHERE clause of the 1st of the two queries, which is probably trivial for you given the progress you made already! However, I think this is the SQL structure you were looking for to solve the data/calculation part of your problem.

    0 讨论(0)
提交回复
热议问题