Как в SQL можно узнать количество пользователей, записи которых были сделаны хотя бы раз за каждую неделю?

Добрый день! Можете, пожалуйста, помочь с задачей? У меня есть таблица с двумя колонками: LOGIN и LOGON_DATETIME, содержащая данные в следующем формате: 

<i>user10 ; 2019-10-10 00:00:00<br/>
user1 ; 2020-10-15 00:00:00<br/>
user3 ; 2020-10-16 00:00:00<br/>
user1 ; 2021-10-17 00:00:00</i> 

Мне нужно выяснить, сколько уникальных логинов в 2020 году логинились хотя бы раз каждую неделю. Как можно это сделать?
  • 6 сентября 2024 г. 7:23
Ответы на вопрос 2
Для решения вашей задачи вам нужно обращаться к данным из таблицы, группировать их по неделям и проверять, были ли записи для каждого пользователя на каждую неделю 2020 года. 

Вот пример SQL-запроса, который это реализует:

```sql
WITH WeekNumbers AS (
    SELECT 
        DATE_TRUNC('week', DATE '2020-01-01' + INTERVAL '1 week' * generate_series(0, 51)) AS week_start
),
UserLogins AS (
    SELECT 
        LOGIN,
        DATE_TRUNC('week', LOGON_DATETIME) AS week_start
    FROM 
        your_table_name
    WHERE 
        LOGON_DATETIME >= '2020-01-01' AND LOGON_DATETIME < '2021-01-01'
    GROUP BY 
        LOGIN, week_start
),
WeeklyLogins AS (
    SELECT 
        wn.week_start,
        ul.LOGIN
    FROM 
        WeekNumbers wn
    LEFT JOIN 
        UserLogins ul 
    ON 
        wn.week_start = ul.week_start
)
SELECT 
    LOGIN
FROM 
    WeeklyLogins
GROUP BY 
    LOGIN
HAVING 
    COUNT(DISTINCT week_start) = 52;
```

### Объяснение запросов:

1. **WeekNumbers**: Мы создаем список недель в 2020 году, начиная с 1 января и добавляя интервал по неделям. У нас получится 52 недели.

2. **UserLogins**: Мы выбираем логины пользователей и обрезаем даты входа до начала недели. Мы фильтруем данные так, чтобы оставались только все логины в 2020 году.

3. **WeeklyLogins**: Затем мы соединяем списки недель и логинов, чтобы получить все логины за каждую неделю. Это позволяет нам увидеть, сколько раз пользователи логинились на каждой отдельной неделе.

4. В финальном селекте мы группируем по логинам и используем HAVING, чтобы оставить только тех пользователей, которые логинились на всех 52 неделях.

Обратите внимание, что имена ваших таблиц и столбцов должны соответствовать тому, что у вас есть в базе данных. В результате запроса вы получите список уникальных логинов пользователей, которые логинились хотя бы раз в каждую неделю 2020 года.
SELECT count(distinct login), week(logon_datetime) as _week FROM users GROUP BY _week


если надо за конкретный год, то
SELECT count(distinct login), week(logon_datetime) as _week FROM users WHERE year(logon_datetime) = 2020 GROUP BY _week
Похожие вопросы