#sql #postgresql #datetime #count #window-functions
#sql #postgresql #дата-время #количество #окно-функции
Вопрос:
Я хочу фильтровать записи на основе временного интервала, но у меня есть временные метки. У меня есть таблица ‘df’ со следующими именами столбцов:
id — int time — правильность временной метки — логический объект — текст
Каждый студент (id) выполняет задания по определенному предмету (subject). Система присваивает значение «True» в столбце «правильность», если назначение выполнено правильно, и «False», если нет. Время (time), когда учащийся завершает задание, также сохраняется системой.
Мне нужно написать SQL-запрос, в котором учитываются все учащиеся, успешно выполнившие 20 заданий в течение часа в марте 2020 года. Мне нужно подсчитать тех, кто выполнил задачи в течение часа, с фактического времени их начала и фактического времени завершения.
Заранее спасибо!
Комментарии:
1. Мне нужно подсчитать тех, кто выполнил задачи в течение часа, с фактического времени их начала и фактического времени завершения. ‘Date_trunc’ не предусматривает этого
Ответ №1:
Вы могли бы использовать оконные функции и рамку диапазона:
select distinct id
from (
select
t.*,
count(*) filter(where correctness) over(
partition by id
order by time
range between interval '1 hour' preceding and current row
) cnt
from mytable t
where time >= date '2020-03-01' and time < date '2020-04-01'
) t
where cnt > 20
Функция window подсчитывает, сколько задач было успешно выполнено одним и тем же пользователем за последний час; затем вы можете использовать эту информацию для фильтрации результирующего набора.
Это дает вам список пользователей, которые удовлетворяют условию. Если вам нужно количество таких пользователей, замените select distinct id
на select count(distinct id)
.
Комментарии:
1. Спасибо, но мне нужно подсчитать тех, кто выполнил задачи в течение часа, с фактического времени их начала и фактического времени их завершения.
2. @Alex: это то, что делает запрос… Вы пробовали это?
3. Да, это сработало, но корректность не сработала. Я изменил правильность = ‘True’, но она по-прежнему включает наблюдения со значениями ‘True’ и ‘False’.
4. @Alex: вы не указали, что делать с негативами. Вы сказали, что вам нужны пользователи, у которых есть не менее 20 положительных результатов за один час, что и делает запрос.