SQL检索每个ID的最新记录(过时)?

时间:2017-10-15 10:52:11

标签: mysql

SELECT detailsID,`Topic 1 Scores`, MAX(Date) as "Date" 
FROM Information.scores 
WHERE `Topic 1 Scores` IS NOT NULL 
GROUP BY `detailsID`,`Topic 1 Scores`

正在打印;

detailsID, Topic 1 Scores, MAX(Date)

2 0 26/09/2017

2 45 26/09/2017

2 100 26/09/2017

3 30 25/09/2017

3 80 14/10/2017

而不是实际选择每个detailsID的最新日期,而不是:

2 100 26/09/2017

3 80 14/10/2017

我想检索每个detailsID的最新得分(不包括空)(按日期排序)的TOPIC 1分数(这里只有详细IDID 2和3,因此只返回两个结果)

Solution 1 attempt

Inner subquery

2 个答案:

答案 0 :(得分:1)

你可以这样做:

SELECT t1.detailsID, t1.`Topic 1 Scores`, t1.date
FROM scores as t1
INNER JOIN
(
    SELECT detailsID, MAX(date) as "LatestDate" 
    FROM scores 
    WHERE `Topic 1 Scores` IS NOT NULL 
    GROUP BY `detailsID`
) AS t2 ON t1.detailsID = t2.detailsID AND t1.date = t2.LatestDate

子查询将为您提供每个detailsID的最新日期,然后在外部查询中,与原始表的连接将消除除最近日期之外的所有行。

<强> 更新

有些行具有相同的最新日期,这就是为什么你会有多个行具有相同的日期和相同的detailsID,为了解决这个问题,你可以为分数添加另一个聚合,这样你每个行只有一行详细ID与最新日期和最高分数:

SELECT t1.detailsID, t1.`Topic 1 Scores`, t1.date
FROM scores as t1
INNER JOIN
(
    SELECT detailsID, MAX(`Topic 1 Scores`) AS MaxScore, MAX(date) as "LatestDate" 
    FROM scores 
    WHERE `Topic 1 Scores` IS NOT NULL 
    GROUP BY `detailsID`
) AS t2  ON t1.detailsID = t2.detailsID 
        AND t1.date = t2.LatestDate
        AND t1.`Topic 1 Scores` = t2.MaxScore

结果:

| detailsID | Topic 1 Scores |       date |
|-----------|----------------|------------|
|         2 |            100 | 2017-09-26 |
|         3 |             80 | 2017-10-14 |

答案 1 :(得分:0)

WITH MYCTE AS 
 (
  SELECT DetailsId, [Topic 1 Score], ROW_NUMBER() OVER ( Partition BY            DetailsID ORDER BY DATE DESC) Num
  FROM Scores
)
SELECT * FROM MYCTE WHERE num = 1
GO