#postgresql #select
#postgresql #выберите
Вопрос:
Я пишу запрос, чтобы получить количество входов в систему, которые пользователь сделал за последние 30 дней.
Загвоздка в том, что пользователь может входить в систему несколько раз в день, но я хочу считать только одну запись в день. Таким образом, максимальное возвращаемое значение для пользователя будет равно 30.
Я мог бы выполнить эту логику в Node, но я очень хочу посмотреть, можно ли это сделать по запросу
Ниже приведены PID, userId, дата и время входа в систему (порядок по логину) — «таблица логинов»
9 1000000000 2020-12-08 14:01:56
10 1000000000 2020-12-08 14:01:56
8 1000000000 2020-12-09 14:01:56
20 1000000001 2020-12-09 14:04:48
19 1000000001 2020-12-09 14:04:48
18 1000000001 2020-12-09 14:04:48
7 1000000000 2020-12-10 14:01:56
6 1000000000 2020-12-11 14:01:56
16 1000000001 2020-12-11 14:04:48
17 1000000001 2020-12-11 14:04:48
5 1000000000 2020-12-12 14:01:56
24 1000000002 2020-12-12 14:05:46
4 1000000000 2020-12-13 14:01:56
15 1000000001 2020-12-13 14:04:48
14 1000000001 2020-12-13 14:04:48
26 1000000002 2020-12-13 14:05:46
25 1000000002 2020-12-13 14:05:46
3 1000000000 2020-12-14 14:01:56
13 1000000001 2020-12-14 14:04:48
1 1000000000 2020-12-15 14:01:13
2 1000000000 2020-12-15 14:01:56
11 1000000000 2020-12-15 14:01:56
12 1000000001 2020-12-15 14:04:48
21 1000000001 2020-12-15 14:04:48
23 1000000002 2020-12-15 14:05:46
22 1000000002 2020-12-15 14:05:46
Запрос — не уверен, как получить 1 значение за день с несколькими входами в систему. Групповое наблюдение не сработало бы. Возможно, существует функция Windows, которая позволяет это сделать.
select *
from dating.logins
where
userid = 1000000000
and datetime > NOW() - INTERVAL '30 DAY'
order by datetime;
Комментарии:
1. Я бы сделал дату строкой, затем отрезал часть дня и сгруппировал по ней… выберите count(*), pid из группы логинов по substr(приведение (дата, строка), 0,10) или что-то подобное
Ответ №1:
А как насчет этого :
select userid,
count(distinct date_trunc('day', datetime)) as countLogins
from dating.logins
where
userid = 1000000000
and datetime > NOW() - INTERVAL '30 DAY'
Group by userId;
Комментарии:
1. Блестяще — большое спасибо… Я переключил ‘date_trunc’ на ‘trunc’… приветствия!