我有一个大型学区数据库,我需要从中确定学期,学期和全年的开始和结束日期。每个学校可能有不同的假期(与周末一起计算到学期开始日期),尽管不太可能。 我已经达到了拉动学校,他们的假期和每个学期的结束日期,并从计算出每个学期的开始日期。到现在为止还挺好。但是有些学校有一些课程和其他课程注册了全年(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
感谢帮助,实现这一目标具有挑战性。
答案 0 :(得分:0)
以下是解决此问题的方法:
TermCode
不是YR
TermCode
为YR
的所有记录,但按SchoolId
,SchoolYear
,TermCode
和TermCodeId
对其进行分组,然后获取每组Max(TermBegin)
和Max(TermEnd)
。 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 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回答,了解如何做到这一点。
请注意我无法编译或测试上述内容,因此您可能需要对其进行调整,但步骤完全存在,并且由于您拥有数据,因此不容易做到。