mysql 用于获取记录的最新条目的SQL查询

e5nqia27  于 2023-03-28  发布在  Mysql
关注(0)|答案(4)|浏览(158)

我有下面的样本数据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

pieyvz9o

pieyvz9o1#

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

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
xkftehaa

xkftehaa2#

演示:
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列。这些列表示最新的考试日期,并为每个考试为“是”的学生进行标记。
mnemlml8

mnemlml83#

尝试类似的东西,使用Joins:

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
disbfnqx

disbfnqx4#

请尝试这个&让我知道仍然如果您有任何疑问

SELECT 
    Student_number,Exam,Mark,Date_of_exam
FROM
    tblname
WHERE
    (Student_number, Date_of_exam) IN (SELECT 
            Student_number, MAX(Date_of_exam)
        FROM
            tblname
        WHERE
            exam = 'Yes'
        GROUP BY Student_number);

相关问题