C#Linq到SQL,在分组行中查找最小和最大日期
我有一个大型学区数据库,我需要从中确定学期、学期和全年的开始和结束日期。每所学校可能有不同的假期(连同周末一起计算到学期开始日期),尽管不太可能。 我已经了解了学校、学校假期和每个学期的结束日期,并由此计算出每个学期的开始日期。到现在为止,一直都还不错。但有些学校有一些课程是按学期注册的,还有一些课程是全年(9月至6月)注册的。因此,我希望我最后返回的日期看起来像(这代表许多学校之一): 我得到的最接近的是这个查询(使用我计算开始日期的结果): 它正确地返回了期限,但每个期限都有一年。我需要的是一个YR行,其中包含YR行的最小值(TermBegin)和最大值(TermEnd)。我需要对SchoolId和TermCode进行分组,并获得每个唯一代码的最小值和最大值,但我不知道如何进行 我从上面的Linq中得到的数据如下。 Min(TermBegin)YR行中的TermCodeId是我需要在结果中包含的TermCodeIdC#Linq到SQL,在分组行中查找最小和最大日期,c#,linq,group-by,min,C#,Linq,Group By,Min,我有一个大型学区数据库,我需要从中确定学期、学期和全年的开始和结束日期。每所学校可能有不同的假期(连同周末一起计算到学期开始日期),尽管不太可能。 我已经了解了学校、学校假期和每个学期的结束日期,并由此计算出每个学期的开始日期。到现在为止,一直都还不错。但有些学校有一些课程是按学期注册的,还有一些课程是全年(9月至6月)注册的。因此,我希望我最后返回的日期看起来像(这代表许多学校之一): 我得到的最接近的是这个查询(使用我计算开始日期的结果): 它正确地返回了期限,但每个期限都有一年。我需要的是
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
感谢您的帮助,走到这一步很有挑战性。以下是解决此问题的方法:
TermCode
不是YR
TermCode
为YR
的所有记录,但按SchoolId
、SchoolYear
、TermCode
和TermCodeId
对它们进行分组,并获取每组的Max(TermBegin)
和Max(TermEnd)
李>
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
子句和一个groupby
和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
让我们执行一个联合
:
var finalQuery = excludingYr.Union(yearRecords);
因为您需要
TermCodeId
,第二步将有重复记录,所以我们需要在这里做一些练习来消除重复。看看答案,看看你如何做这部分
请注意,我无法编译或测试上述内容,因此您可能需要对其进行调整,但步骤都在那里,因为您有数据,所以不容易做到。以下是解决此问题的方法:
TermCode
不是YR
TermCode
为YR
的所有记录,但按SchoolId
、SchoolYear
、TermCode
和TermCodeId
对它们进行分组,并获取每组的Max(TermBegin)
和Max(TermEnd)
李>
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
子句和一个groupby
和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
让我们执行一个联合
:
var finalQuery = excludingYr.Union(yearRecords);
因为您需要
TermCodeId
,第二步将有重复记录,所以我们需要在这里做一些练习来消除重复。看看答案,看看你如何做这部分
请注意,我无法编译或测试上述内容,因此您可能需要对其进行调整,但这些步骤都在那里,而且由于您有数据,因此不容易操作。按
学号、学年和学期代码对它们进行分组。如果YR
的TermCode
可能是Year
或其他值,则首先在数据库端修复数据。找到一年中使用的所有不同代码,并使它们都相同,只有一个值:这是一个代码,所以应该是相同的。不幸的是,我无法控制数据。然而,术语代码在年份和学校是一致的,所以我删除了这一部分。我知道我需要分组,然后取最小值和最大值,但我不知道怎么做。按学校ID、学年和学期代码对它们进行分组。如果YR
的TermCode
可能是Year
或其他值,则首先在数据库端修复数据。找到一年中使用的所有不同代码,并使它们都相同,只有一个值:这是一个代码,所以应该是相同的。不幸的是,我无法控制数据。然而,术语代码在年份和学校是一致的,所以我删除了这一部分。我知道我需要分组,然后取最小值和最大值,但我不知道怎么做。谢谢你CodingYoshi,我一直在努力解决这个问题。明天当我有权访问我所有的数据时,我会试试它,并告诉你它是如何工作的。谢谢你CodingYoshi,我一直在努力解决这个问题。明天当我可以访问我的所有数据并让你知道结果时,我会尝试一下。