C#Linq to SQL,查找分组行中的最小和最大日期

时间:2017-04-09 01:07:08

标签: c# linq group-by min

我有一个大型学区数据库,我需要从中确定学期,学期和全年的开始和结束日期。每个学校可能有不同的假期(与周末一起计算到学期开始日期),尽管不太可能。 我已经达到了拉动学校,他们的假期和每个学期的结束日期,并从计算出每个学期的开始日期。到现在为止还挺好。但是有些学校有一些课程和其他课程注册了全年(9月至6月)。所以我希望我的最终返回日期看起来像(这代表了许多学校中的一个):

dictionary = {'a': 1, 'b': 2, 'c': 3}

chosen = raw_input("choose one:")

if chosen in dictionary: #added colon and changed to if chosen in dictionary
    print(chosen + " : " + str(dictionary[chosen])) #changed to bring both key and value because I didn't know which you wanted
else:
    print("Invalid choice") #I added a new line.

我最接近的是这个查询(使用我计算开始日期的结果):

SchoolId SchoolYear TermCode    TermBegin        TermEnd      TermCodeId
8CFD1     2016      TM1         08/29/2016       10/07/2016     F375E7
8CFD1     2016      TM2         10/10/2016       11/25/2016     898EF5
8CFD1     2016      TM3         11/28/2016       02/01/2017     F5140C
8CFD1     2016      TM4         02/02/2017       03/10/2017     DD95B1
8CFD1     2016      TM5         03/13/2017       05/05/2017     BE3635
8CFD1     2016      TM6         05/08/2017       06/09/2017     2B94F0
8CFD1     2016      YR          08/29/2016       06/09/2017     D97C9C

正确返回条款,但每个学期我得到一年(YR)。我需要的是一个YR行,它具有YR行的Min(TermBegin)和Max(TermEnd)。我需要对SchoolId和TermCode进行分组,并获取每个唯一代码的Min和Max,但我不知道如何。

我从上面的Linq获得的数据如下。 Min(TermBegin)YR行中的TermCodeId是我在结果中需要的TermCodeId。

from tdf in ReturnFromCalculatingStartDate 
            join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu equals tcd.SCHOOL_YEAR_TRM_DEF_GU
            orderby tcd.TERM_CODE
            select new TermResult {     
                SchoolId = testOrgGu,
                SchoolYear = testSchoolyear,
                TermCode = tcd.TERM_CODE,
                TermBegin = tdf.TermStartDate,
                TermEnd = tdf.TermEndtDate,
                TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU

感谢帮助,实现这一目标具有挑战性。

1 个答案:

答案 0 :(得分:0)

以下是解决此问题的方法:

  1. 获取TermCode不是YR
  2. 的所有记录
  3. 获取TermCodeYR的所有记录,但按SchoolIdSchoolYearTermCodeTermCodeId对其进行分组,然后获取每组Max(TermBegin)Max(TermEnd)
  4. 在上面的步骤1和2中对结果执行Union
  5. 第1步

    我们需要的是在查询中添加where子句,如下所示:

    where tcd.TERM_CODE != "YR"
    

    但是我们将查询保存在变量中,以便更具可读性。请注意添加where子句:

    var excludingYr =
        from tdf in ReturnFromCalculatingStartDate
        join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu
            equals tcd.SCHOOL_YEAR_TRM_DEF_GU
        where tcd.TERM_CODE != "YR"
        orderby tcd.TERM_CODE
        select new TermResult
        {
            SchoolId = testOrgGu,
            SchoolYear = testSchoolyear,
            TermCode = tcd.TERM_CODE,
            TermBegin = tdf.TermStartDate,
            TermEnd = tdf.TermEndtDate,
            TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU
        };
    

    第2步

    我们需要添加where子句和group by以及Min和'Max':

    var yearRecords =
        from tdf in ReturnFromCalculatingStartDate
        join tcd in SCH_YR_TRM_CODES on tdf.SchoolYearTermDefGu
            equals tcd.SCHOOL_YEAR_TRM_DEF_GU
        where tcd.TERM_CODE == "YR"
        orderby tcd.TERM_CODE
        group tdf by new
            {
                SchoolId = testOrgGu,
                SchoolYear = testSchoolyear,
                TermCode = tcd.TERM_CODE,
                TermCodeId = tcd.SCHOOL_YEAR_TRM_CODES_GU
        } into yrs
        select new TermResult
        {
            SchoolId = yrs.Key.SchoolId,
            SchoolYear = yrs.Key.testSchoolyear,
            TermCode = yrs.Key.TermCode,
            TermBegin = yrs.Min(x => x.TermBegin),
            TermEnd = yrs.Max(x => x.TermBegin),
            TermCodeId = yrs.Key.TermCodeId
        };
    

    第3步

    让我们执行Union

    var finalQuery = excludingYr.Union(yearRecords);
    

    因为你需要TermCodeId,所以第二步会有重复的记录,所以我们需要在这里做一些体操来消除重复。请参阅this回答,了解如何做到这一点。

    请注意我无法编译或测试上述内容,因此您可能需要对其进行调整,但步骤完全存在,并且由于您拥有数据,因此不容易做到。