簡體   English   中英

SQL 顯示GROUP BY中的最新記錄?

[英]SQL Show most recent record in GROUP BY?

我有一個看起來像這樣的表:

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  

我對如何去做有點迷茫?

編輯:

好的,伙計們,我現在在我的真實電腦上,對於構建不當的問題感到抱歉。

這是我實際上想做的事情:

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”,所以我不會獲得多個條目。

從這個開始:

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)

但我更喜歡元組測試,它更整潔

現場測試: http ://www.sqlfiddle.com/#!2/771b8/5

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

對於在撰寫本文時(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
)
SELECT *
FROM TheTable a
WHERE NOT EXISTS(SELECT *
                 FROM TheTable b
                 WHERE b.StudentCode = a.StudentCode AND b.DateApproved > a.DateApproved)

這對我在 postgres 中更有效。

select * from tbl t1 where t1.DateApproved = (select max(t2.DateApproved) from tbl t2 where t2.StudentId = t1.StudentId)

此代碼適用於 SQL Server 2016。

select StudentId, max(DateApproved) 來自 tbl group by StudentId

此代碼將顯示每個學生 ID 批准的最大和最小日期。

select StudentId,最大值(批准日期),最小值(批准日期)
來自 tbl 按 StudentId 分組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM