2017-04-09 518 views
1

我有一個大的學區數據庫,從中需要確定術語,學期和整年的開始和結束日期。每個學校都可能有不同的假期(其中週末計算爲期限開始日期),儘管這不太可能。 我已經獲得了拉到學校,他們的假期和每學期的結束日期,並從中計算出每學期的開始日期。到現在爲止還挺好。但有些學校有一些班級在全年(9月至6月)註冊。所以,我希望我的最後返回的日期看起來像(這代表了許多學校之一):C#Linq to SQL,查找分組行中的最小和最大日期

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 

我得到的最接近是此查詢(使用的結果,我已經計算的開始日期):

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 

它正確地返回了這些條款,但是我爲每個條款獲得了一年(YR)。我需要的是一個具有YR行的Min(TermBegin)和Max(TermEnd)的YR行。我需要在SchoolId和TermCode上進行分組,並獲取每個唯一代碼的最小值和最大值,但我不知道如何。

我從上面的Linq返回的數據如下。 Min(TermBegin)YR行的TermCodeId是我需要在結果中使用的TermCodeId。

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 10/07/2016 d97C9C 
    8CFD1 2016   YR   10/10/2016 11/25/2016 e30980 
    8CFD1 2016   YR   11/28/2016 02/01/2017 ef5de2 
    8CFD1 2016   YR   02/02/2017 03/10/2017 bbe78f 
    8CFD1 2016   YR   03/13/2017 05/05/2017 ca28a7 
    8CFD1 2016   YR   05/08/2017 06/09/2017 2340c1 

欣賞幫助,讓這遠遠具有挑戰性。

+0

集團通過他們'SchoolId,學年和TermCode'。如果'TermCode'用於'YR'可以是'Year'或其他值,則首先固定在數據庫側的數據。發現用於一年所有不同的代碼,使他們都是一樣的,一個價值:它是一個代碼,所以它應該是相同的。 – CodingYoshi

+0

不幸的是,我無法控制數據。然而TermCode對於年和學校是一致的,所以我刪除了那一點。我知道我需要組隊,然後選擇Min和Max,但我不知道該怎麼做。 – Jazzy

回答

0

這裏是如何解決這一問題:

  1. 獲取所有的記錄中,其中TermCodeYR
  2. SchoolIdSchoolYearTermCode和所有的記錄中,其中TermCodeYR但他們組TermCodeId,並獲得每個組的Max(TermBegin)Max(TermEnd)
  3. 對上述步驟1和2中的結果執行Union

步驟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 byMin和 '最大':

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,第2步將重複的記錄,所以我們需要在這裏做一些體操刪除重複。請參閱this答案以瞭解如何做到這一點。

請注意我無法編譯或測試上面,所以你可能需要調整,但步驟都是那裏,因爲你擁有的數據,它不應該是很容易做到。

+0

謝謝CodingYoshi,我一直在這個掙扎。我將在明天訪問我所有的數據時嘗試它,並讓你知道它是如何實現的。 – Jazzy