[英]Retrive distinct record based on ID order by Date
我有一個查詢:
select C.ChapterID, C.ChapterName, TA.TestAllotmentID,
T.TestName, S.StudentFname, B.BatchName, TA.UpdatedDate
from TransTestAllotment TA,
MstStudent S,
MstBatchDetails B,
MstTest T,
MstChapter C
where TA.StudentID = 47
and TA.BatchID = 10
and T.TestID = TA.TestID
and S.StudentID = TA.StudentID
and B.BatchID = TA.BatchID
and T.ChapterID = C.ChapterID
and TA.IsAttempted = 'True'
and TA.IsEvaluated = 'True'
order by TA.UpdatedDate desc
返回結果如下。
+-----------+-----------------------+-----------------+-------------------------+
| ChapterID | ChapterName | TestAllotmentID | UpdatedDate |
+-----------+-----------------------+-----------------+-------------------------+
| 52 | HTML Basics - Part II | 37 | 2016-03-14 13:12:53.000 |
| 52 | HTML Basics - Part II | 36 | 2016-03-14 13:11:59.000 |
| 52 | HTML Basics - Part II | 35 | 2016-03-14 13:11:35.000 |
| 50 | HTML Basics - Part I | 28 | 2016-03-11 18:45:51.000 |
| 50 | HTML Basics - Part I | 27 | 2016-03-11 18:45:05.000 |
| 50 | HTML Basics - Part I | 26 | 2016-03-11 18:43:48.000 |
| 50 | HTML Basics - Part I | 24 | 2016-03-11 18:42:37.000 |
| 50 | HTML Basics - Part I | 22 | 2016-03-11 18:41:07.000 |
+-----------+-----------------------+-----------------+-------------------------+
現在,我想根據更新日期按章ID順序檢索不同的記錄。 我期望的最終輸出是:
+-----------+-----------------------+-----------------+-------------------------+
| ChapterID | ChapterName | TestAllotmentID | UpdatedDate |
+-----------+-----------------------+-----------------+-------------------------+
| 52 | HTML Basics - Part II | 37 | 2016-03-14 13:12:53.000 |
| 50 | HTML Basics - Part I | 28 | 2016-03-11 18:45:51.000 |
+-----------+-----------------------+-----------------+-------------------------+
如何編寫SQL查詢以獲取此輸出?
您應該修復查詢以使用正確的顯式JOIN
語法。 但是,您的問題的答案是使用窗口函數:
with q as (
<your query here>
)
select q.*
from (select q.*,
row_number() over (partition by chapterid order by updateddate desc) as seqnum
from q
) q
where seqnum = 1;
謝謝Gordon Linoff。 我的最終查詢如下。
Select Y.* from (select X.*, row_number() over (partition by chapterid order by updateddate desc) as SequencNo from
(Select C.ChapterID,C.ChapterName,TA.TestAllotmentID, T.TestName,
S.StudentFname,B.BatchName,TA.UpdatedDate
from TransTestAllotment TA, MstStudent S, MstBatchDetails B,
MstTest T,MstChapter C
where TA.StudentID=47 and TA.BatchID=10 and
T.TestID=TA.TestID and S.StudentID=TA.StudentID and
B.BatchID=TA.BatchID and T.ChapterID=C.ChapterID and
TA.IsAttempted='True' and TA.IsEvaluated='True') X) Y Where SequencNo=1
我建議使用JOIN重塑查詢,然后查看是否需要其他子句:
這是一個嘗試
SELECT
C.ChapterID,
C.ChapterName,
FROM
(SELECT
TA.TestAllotmentID,
T.TestName,
S.StudentFname,
B.BatchName,
TA.UpdatedDate
FROM TransTestAllotment TA
LEFT JOIN MstStudent S ON S.StudentID=TA.StudentID
LEFT JOIN MstBatchDetails B ON B.BatchID=TA.BatchID
LEFT JOIN MstTest T ON T.TestID=TA.TestID
WHERE TA.StudentID=47
AND TA.BatchID=10 as T1
AND TA.IsAttempted='True'
AND TA.IsEvaluated='True'
ORDER BY TA.UpdatedDate desc)
LEFT JOIN MstChapter C ON T1.ChapterID=C.ChapterID;
問候
您可以嘗試以下查詢:
select C.ChapterID, C.ChapterName, TA.TestAllotmentID, TA.UpdatedDate
from TransTestAllotment TA,
MstStudent S,
MstBatchDetails B,
MstTest T,
MstChapter C
where TA.StudentID = 47
and TA.BatchID = 10
and T.TestID = TA.TestID
and S.StudentID = TA.StudentID
and B.BatchID = TA.BatchID
and T.ChapterID = C.ChapterID
and TA.IsAttempted = 'True'
and TA.IsEvaluated = 'True'
group by C.ChapterID, C.ChapterName, TA.TestAllotmentID, TA.UpdatedDate
having (C.ChapterID,TA.TestAllotmentID) in
(select C1.ChapterID ,max(TA1.TestAllotmentID)
from TransTestAllotment TA1, MstTest T1, MstChapter C1
where T1.TestID = TA1.TestID and T1.ChapterID = C1.ChapterID)
order by TA.UpdatedDate desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.