SQL - рассчитать коэффициент доступа на основе еженедельной метки времени

У меня есть тематическое исследование, похожее на обсуждаемое здесь: пользователи, использующие временную метку входа в MySQL

Однако я хотел бы решить это на языке SQL Server (не mySQL), и у меня есть 2 немного разных запроса: Учитывая таблицу, содержащую User_id и login_timestamp, рассчитать:

1) Доля людей, которые заходили в систему каждый день на прошлой неделе 2) Ежемесячная частота доступа людей, учитывая их последний вход в систему (например, если предположить, что их последний вход был вчера, какова была ежемесячная частота, начиная со вчерашнего дня и глядя на 1 месяц назад?)

На первый вопрос у меня есть ответ, но я хотел бы спросить, может ли кто-нибудь подтвердить его для меня?

select sum(A.access)/count(A.access) as ratio_weekly_access
from
(select user_id,
case when
    count(distinct format(timestamp_login,'YYYY-MM-DD')) =7 then 1
    else 0 end as access
from xxx
where FORMAT(timestamp_login,'YYYY-MM-DD') between dateadd(day,-7, cast(getdate() as date)) and cast(getdate() as date)
group by user_id
) A

Заранее спасибо за вашу помощь!


person Elly    schedule 16.10.2016    source источник
comment
Ваш вопрос не ясен. Что вы подразумеваете под отношением количества людей, которые заходили в систему каждый день на прошлой неделе? Для КОЭФФИЦИЕНТА требуются ДВЕ ссылки (например, процент зарегистрированных пользователей, которые заходили в систему каждый день в течение последней недели, будет означать сравнение против общего количества зарегистрированных пользователей). Кроме того, необходимо проверить, что за последние 7 дней был хотя бы один вход в систему; недостаточно их посчитать (может быть 7 входов в один день).   -  person FDavidov    schedule 16.10.2016
comment
Извините за неясность. Таким образом, под отношением я подразумеваю долю пользователей, которые заходили в систему 7 раз в неделю, от общего числа пользователей, которые заходили в систему хотя бы один раз).   -  person Elly    schedule 16.10.2016
comment
Я подсчитал (различный формат (timestamp_login, 'ГГГГ-ММ-ДД')) = 7, где я преобразовал временную метку в формат даты, поэтому, если я выполню Distinct, я ожидаю получить количество уникальных дат. Кроме того, я уже отфильтровал в операторе where только метку времени между сегодняшним днем ​​и неделей ранее, поэтому это должно дать мне только интересующие метки времени.   -  person Elly    schedule 16.10.2016
comment
Итак, вам нужно сравнить количество пользователей, которые заходили хотя бы раз в день за последние 7 дней, с теми, кто заходил хотя бы один раз за последние 7 дней. Я думаю, что у вашего запроса есть две проблемы: (1) я не понимаю, как вы считаете тех, кто заходил в систему хотя бы один раз (кстати, это должно включать пользователей, которые заходили в систему каждый день тоже?), (2) в case , count (distinct...), я не думаю, что это сработает, поскольку случай будет проверять каждую запись набора результатов, соответствующую условию where.   -  person FDavidov    schedule 16.10.2016
comment
позвольте мне попытаться объяснить мою логику ‹выбрать * из xxx, где FORMAT(timestamp_login,'YYYY-MM-DD') между dateadd(day,-7, cast(getdate() as date)) и cast(getdate() as date )› Должен дать мне все временные метки за последнюю неделю. Из этой таблицы я делаю ‹count(разные даты)› группировку по пользователю. Если this= 7, то я присваиваю переменной Access=1, если не 7 (что означает, что она как минимум 1, учитывая тот факт, что я выбрал всех пользователей, которые вошли в систему на прошлой неделе), то Access=0. Теперь: Sum(access)=люди, которые вошли в систему 7 раз, и Count(Access)=люди, которые вошли хотя бы один раз. Это правильно?   -  person Elly    schedule 16.10.2016
comment
У меня есть сомнения по поводу CASE...COUNT, но у меня нет доступа к базе данных, чтобы проверить это. Если вы попробовали и это сработало, значит, все в порядке.   -  person FDavidov    schedule 16.10.2016