Postgres запрашивает логины для каждого пользователя в течение 30 дней, считая каждый день только один раз

#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’… приветствия!