【问题标题】:sql GROUP BY but use the most recent record?sql GROUP BY 但使用最近的记录?
【发布时间】:2012-05-04 09:48:06
【问题描述】:

我正在尝试做这样的事情,但我不确定是否可以使用简单的 GROUP BY:

SELECT GD.GradebookDetailId, G.SubjectCode, G.Description, G.UnitsAcademic, G.UnitsNonAcademic, 
GD.Grade, GD.Remarks, G.FacultyName, STR_TO_DATE(G.DateApproved, '%m/%d/%Y %h:%i:%s') AS 'DateAproved'

FROM gradebookdetail GD 
INNER JOIN gradebook G ON GD.GradebookId=G.GradebookId 
WHERE G.DateApproved IS NOT NULL AND G.GradebookType='final' AND StudentIdNumber='2012-12345'

GROUP BY ???????
ORDER BY G.SubjectCode ASC

所以当我有这样一张桌子时:

学生:2012-12345

SubjectCode | Grade | DateApproved
SUBJ123 | 2.00 | 1/4/2012
SUBJ123 | 1.75 | 1/5/2012
SUBJ987 | 1.50 | 1/5/2012

它应该是这样的:

学生:2012-12345

SubjectCode | Grade | DateApproved
SUBJ123 | 1.75 | 1/5/2012
SUBJ987 | 1.50 | 1/5/2012

编辑:这是解决方案:

SELECT 
    GD.GradebookDetailId, 
    G.SubjectCode, 
    G.Description, 
    G.UnitsAcademic, 
    G.UnitsNonAcademic, 
    GD.Grade, 
    GD.Remarks, 
    G.FacultyName, 
    STR_TO_DATE(G.DateApproved, '%m/%d/%Y %h:%i:%s') AS 'DateAproved'
FROM 
    gradebookdetail GD INNER JOIN 
    gradebook G ON GD.GradebookId=G.GradebookId 
WHERE 
    G.DateApproved IS NOT NULL AND 
    G.GradebookType='final' AND 
    StudentIdNumber='2011-10172' AND 
    NOT EXISTS (
        SELECT 1 FROM gradebook G2 INNER JOIN gradebookdetail GD2 ON G2.GradebookId=GD2.GradebookId
        WHERE 
            G2.GradebookType = 'final' AND 
            G2.DateApproved IS NOT NULL AND 
            GD2.StudentIdNumber = GD.StudentIdNumber AND 
            G2.SubjectCode = G.SubjectCode AND
            G2.DateApproved > G.DateApproved
    )
ORDER BY G.SubjectCode ASC

【问题讨论】:

  • 你想要完成什么?是获取最新的ApprovedDate和等级的不同Subjectcodes的记录吗?那么子选择会更合适。
  • @Falle1234,是的,这就是我想要完成的。使用最新的 DateApproved 获得不同的 SubjectCodes

标签: group-by sql-order-by


【解决方案1】:

我认为这个查询会做你想做的事,但我还没有测试过。所以,如果有什么问题,请告诉我。

SELECT 
    GD.GradebookDetailId, 
    G.SubjectCode, 
    G.Description, 
    G.UnitsAcademic, 
    G.UnitsNonAcademic, 
    GD.Grade, 
    GD.Remarks, 
    G.FacultyName, 
    STR_TO_DATE(G.DateApproved, '%m/%d/%Y %h:%i:%s') AS 'DateAproved'
FROM 
    gradebookdetail GD INNER JOIN 
    gradebook G ON GD.GradebookId=G.GradebookId 
WHERE 
    G.DateApproved IS NOT NULL AND 
    G.GradebookType='final' AND 
    StudentIdNumber='2012-12345' AND 
    NOT EXISTS (
        SELECT 1 FROM gradebook G2 
        WHERE 
            G2.GradebookType = 'final' AND 
            G2.DateApproved IS NOT NULL AND 
            G2.StudentIdNumber = G.StudentIdNumber AND 
            G2.StudentCode = G.SubjectCode AND
            G2.DateApproved > G.DateApproved
    )
ORDER BY G.SubjectCode ASC

【讨论】:

  • 似乎是什么问题?是没有返回任何行还是选择了错误的行?
  • 它返回错误的行。你能解释一下这种方法吗,也许我们可以进一步调整它?谢谢
  • 我终于用你的方法成功了。但是,我还是不完全明白 呵呵
  • 它所做的基本上是选择您的查询选择的所有相同的行,但随后它会遍历所有选定的行并检查是否不存在具有稍后批准的日期和相同的成绩簿类型的行,StudentIdNumber和主题代码。
猜你喜欢
  • 2012-05-13
  • 2018-09-18
  • 2021-01-13
  • 2016-05-15
  • 2022-08-11
  • 2020-12-19
  • 2018-03-29
  • 2021-01-20
相关资源
最近更新 更多