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次以上考试的学生
答案 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;
答案 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