PostgreSQL:在最近一次考试日期参加了一项以上考试的学生

时间:2018-10-29 14:38:02

标签: sql postgresql

PostgreSQL

数据:

Tests:  
- student (name, all unique)  
- date (MM/DD, assume same year)

示例:
测试:

student  |  date
aa  |  01/01  
aa  |  01/01  
bb  |  01/01  
bb  |  01/02

预期输出:

student  |  date  
aa  | 01/01 

因为bb只参加了1次测试;需要输出在最近的考试日期当天参加了2次以上考试的学生

2 个答案:

答案 0 :(得分:1)

这是使用解析函数的一种方法:

SELECT student, date
FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY student ORDER BY date DESC) rn,
        COUNT(*) OVER (PARTITION BY student, date) cnt
    FROM exams
) t
WHERE rn = 1 AND cnt > 1;

Demo

答案 1 :(得分:1)

您的问题是查询中找不到“最新测试”部分。

因此,我接受了您的查询,并添加了一个子查询以查找每个学生的此信息。将其与您的查询一起过滤掉所有其他测试日期,并且可以正常工作。

SELECT 
    *
FROM exams e 

JOIN (
    SELECT DISTINCT ON (e.student) 
        * 
    FROM exams e 
    ORDER BY e.student, e.date DESC
) s USING (student, date)

GROUP BY e.student, e.date
HAVING COUNT(e.date) >= 2  
ORDER BY e.student  

demo: db<>fiddle