SQL查询获取一条记录的最新条目

问题描述 投票:0回答:3

我有以下示例数据 Sample Data 我想获得每个学生的最新分数。请注意,名为考试的列标记了该作品是否为考试。

我想获得每个人的最新记录,其中 Exam = Yes

我尝试了以下

WITH ranked_messages AS (
select Student_number,Exam,Mark,Date_of_exam,
ROW_NUMBER() OVER (PARTITION BY Student_number ORDER BY Date_of_exam DESC) as rnt
FROM new_table 
)
SELECT * FROM ranked_messages WHERE rnt = 1  and Exam = 'Yes'

我得到了 click here

我期待得到以下信息 click here

mysql sql greatest-n-per-group
3个回答
1
投票

在样本集中,D201 的最新记录没有 Exam = 'Yes',因此它不会从内部查询中获得 rnt = 1。因此,您可能只需要将 Exam-qualifier 移动到内部查询中。像这样:

WITH ranked_messages AS (
    SELECT Student_number,Exam,Mark,Date_of_exam,
ROW_NUMBER() OVER (PARTITION BY Student_number ORDER BY Date_of_exam DESC) as rnt
    FROM new_table 
    WHERE Exam = 'Yes'
)
SELECT * FROM ranked_messages WHERE rnt = 1

0
投票

演示:

http://sqlfiddle.com/#!9/b63280/3

这里是示例数据和模式。

CREATE TABLE new_table (
  Student_number INT,
  Exam VARCHAR(3),
  Mark INT,
  Date_of_exam DATE
);

INSERT INTO new_table VALUES
  (1, 'Yes', 80, '2022-01-01'),
  (1, 'No', 70, '2022-02-01'),
  (2, 'Yes', 90, '2022-01-01'),
  (2, 'Yes', 85, '2022-02-01'),
  (3, 'No', 60, '2022-01-01'),
  (3, 'No', 55, '2022-02-01'),
  (3, 'Yes', 75, '2022-03-01'),
  (4, 'Yes', 95, '2022-02-01'),
  (4, 'No', 80, '2022-03-01');

然后可以这样查询:

SELECT Student_number, Date_of_exam AS Latest_exam_date, Mark
FROM new_table
WHERE Exam = 'Yes'
  AND (Student_number, Date_of_exam) IN (
    SELECT Student_number, MAX(Date_of_exam)
    FROM new_table
    WHERE Exam = 'Yes'
    GROUP BY Student_number
  )
  • 首先,查询选择 new_table 中 Exam 为“Yes”的所有行。

  • 接下来,它使用子查询查找每个 Student_number 的最大 Date_of_exam,其中 Exam 为“Yes”。子查询按 Student_number 对行进行分组,并为每个组选择最大的 Date_of_exam。

  • 外部查询然后通过仅选择 Exam 为“Yes”且 (Student_number, Date_of_exam) 对与步骤 2 的子查询结果匹配的行来过滤步骤 1 的结果。

  • 最后,查询选择过滤行的 Student_number、Date_of_exam 和 Mark 列。这些列代表考试为“是”的每个学生的最新考试日期和分数。


0
投票

尝试类似的东西,使用连接:

SELECT *
FROM (
    SELECT *, RANK() OVER(PARTITION BY e.Name ORDER BY e.AlarmOnTimeStamp desc) rn
    FROM @emp e
    LEFT JOIN @EMPCOMMENT ec ON ec.EmpId = e.Id
) t
WHERE rn = 1
© www.soinside.com 2019 - 2024. All rights reserved.