2017-04-09 3 views
1

私は、学期、学期、年間の開始日と終了日を決定する必要がある大規模な学区データベースを持っています。各学校は休日が異なる場合があります(週末ともに開始日という言葉に計算されます)。 私は、学校、休暇、各学期の終了日、そしてその計算から各学期の開始日を引っ張っています。ここまでは順調ですね。しかし、一部の学校では、1年を通して(9月から6月まで)学期やその他のクラスに登録されたクラスもあります。だから私は(これは多くの学校の1を表す。)のようなものを見て、私の最後の返される日付をしたい: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 

これは正しく条件を返しますが、各用語に対して1年(YR)を取得します。私が必要とするのは、YR行のMin(TermBegin)とMax(TermEnd)を持つ1つの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、SchoolYear、TermCode」でグループ化します。 'YR'の' TermCode'が 'Year'か他の値である場合、まずデータベース側でデータを修正してください。年に使用されたすべての異なるコードを見つけて、それらをすべて同じ値と1つの値にします。これはコードなので、同じでなければなりません。 – CodingYoshi

+0

私は残念なことに、データを制御できません。しかしTermCodeは年と学校で一貫しているので、私はそのビットを削除しました。グループ化してからMinとMaxを取る必要があることは分かっていますが、その方法はわかりません。 – Jazzy

答えて

0

この問題に取り組むためにどのようにある:

  1. TermCodeYR
  2. ではありませんすべてのレコードがSchoolIdSchoolYearによってすべてTermCodeYRで、レコードが、グループにそれらをゲット、TermCodeTermCodeIdを入力し、グループごとにMax(TermBegin)Max(TermEnd)を取得します。
  3. 上記の手順1と2の結果でUnionを実行します。

ステップ1

我々がする必要があるのは、このようなあなたのクエリにwhere句を追加することです:

where tcd.TERM_CODE != "YR" 

しかし、それは、より読みやすいように、変数にクエリを保存することができます。

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 
    }; 

ステップwhere句の追加に注意してください。 3

はのはUnionを実行してみましょう:あなたはTermCodeIdを必要とするので

var finalQuery = excludingYr.Union(yearRecords); 

は、第二段階は、重複するレコードを持つことになりますので、我々は重複を削除するために、ここでいくつかの体操を行う必要があります。どのようにあなたがその部分を行うことができるかを確認するには、this答えを参照してください。

私は上記をコンパイルまたはテストすることができないため、調整する必要があるかもしれませんが、手順はすべてそこにあります。データがあるので、実行するのは簡単ではありません。

+0

ありがとうコーディングヨシ、私はこれに苦労していた。明日私は自分のすべてのデータにアクセスし、それがどのように機能するかを教えてもらいます。 – Jazzy

関連する問題