【问题标题】:SQL Show most recent record in GROUP BY?SQL 在 GROUP BY 中显示最近的记录?
【发布时间】:2012-05-13 18:45:34
【问题描述】:

我有一张如下所示的表格:

id    |    SubjectCode    |    Grade    |    DateApproved    |    StudentId

1            SUB123            1.25            1/4/2012            2012-12345

2            SUB123            2.00            1/5/2012            2012-12345

3            SUB123            3.00            1/5/2012            2012-98765   

我正在尝试 GROUP BY SubjectCode 但我希望它显示最新的 DateApproved,因此它看起来像:

  id    |    SubjectCode    |    Grade    |    DateApproved    |    StudentId

2            SUB123            2.00            1/5/2012            2012-12345

3            SUB123            3.00            1/5/2012            2012-98765  

我有点不知道该怎么做?

编辑:

好的,伙计们现在在我的真实 PC 上,对于这个结构不佳的问题,我深表歉意。

这就是我真正想要做的事情:

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

基本上,我只想显示“SubjectCode”的最近“DateApprove”,所以我不会得到多个条目。

【问题讨论】:

  • 您实际上想按 StudentId 分组。这样做的方法是选择 max(DateApproved)。 (假设 DateApproved 是一个日期字段)
  • 好的,DateApproved 是一个 VARCHAR,这会起作用吗:MAX(STR_TO_DATE(DateApproved, '%d%m%y')) ?
  • 嗯。我想这值得一试。你得试试看。对mysql语法不太熟悉。
  • 首先,通过设置 DATE 数据类型来修复您的日期列。你到底为什么要使用VARCHAR 约会?
  • @ypercube,我没有修改权限

标签: mysql sql group-by sql-order-by


【解决方案1】:

从这里开始:

select StudentId, max(DateApproved) 
from tbl
group by StudentId

然后将其整合到主查询中:

select * 
from tbl
where (StudentId, DateApproved) in

(
  select StudentId, max(DateApproved) 
  from tbl
  group by StudentId
)

你也可以这样用:

select * 
from tbl
join (select StudentId, max(DateApproved) as DateApproved 
      from tbl 
      group by StudentId)
using (StudentId, DateApproved)

但我更喜欢元组测试,这是neater

现场测试:http://www.sqlfiddle.com/#!2/771b8/5

【讨论】:

    【解决方案2】:
    SELECT t2.*
    FROM temp t2 
    INNER JOIN(
        SELECT MAX(DateApproved) as MaxDate, StudentId
        FROM temp
        GROUP BY StudentId
        ) t1 ON t1.MaxDate = t2.DateApproved and t1.StudentId = t2.StudentId
    

    【讨论】:

    • 他可能需要GROUP BY StudentId, SubjectCode(并适当更改ON 条件)。但这是要走的路。
    【解决方案3】:
    SELECT *
    FROM TheTable a
    WHERE NOT EXISTS(SELECT *
                     FROM TheTable b
                     WHERE b.StudentCode = a.StudentCode AND b.DateApproved > a.DateApproved)
    

    【讨论】:

      【解决方案4】:

      对于在撰写本文时(2020 年)仍不支持元组的 SQL Server 中尝试此操作的用户,您可以使用以下内容(在此处改进另一个答案)

      改变这个:

      -- MYSQL
      select * 
      from tbl
      where (StudentId, DateApproved) in
      (
        select StudentId, max(DateApproved) 
        from tbl
        group by StudentId
      )
      

      进入这个:

      -- Microsoft SQL Server
      select * 
      from tbl
      where concat(StudentId, DateApproved) in
      (
        select concat(StudentId, max(DateApproved)) 
        from tbl
        group by StudentId
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2011-12-20
        • 2016-05-15
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        相关资源
        最近更新 更多