PostgreSQL: студенты, которые прошли более одного теста на дату своего последнего теста - PullRequest
0 голосов
/ 29 октября 2018

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 голосов
/ 29 октября 2018

Ваша проблема в том, что нигде в вашем запросе нельзя найти часть с «самым последним тестом».

Итак, я взял ваш запрос и добавил подзапрос, чтобы узнать эту информацию для каждого учащегося. Объединение этого с вашим запросом отфильтровывает каждую другую дату теста, и это работает.

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  

демо: дб <> скрипка

0 голосов
/ 29 октября 2018

Вот один из способов использования аналитических функций:

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;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...