Зацикливать список дат (или любой список) и добавлять запросы в MySQL или снежинку - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в языке sql и недавно снежинка.У меня есть таблица, которая содержит все даты регистрации для всех пользователей в бизнесе

user_id | checkin_date
001       03-06-2018
001       07-07-2018
001       08-01-2018
002       03-19-2018
002       03-27-2018
002       07-11-2018

Теперь я хочу сделать запрос так, чтобы я мог оглянуться назад на query_date, чтобы увидеть, сколько раз каждый пользователь проверял междуquery_date - 7 и query_date, qyery_date - 90 и дата запроса ... следующий запрос снежинки выполняет работу правильно для query_date = '2018-08-01'.

with user_checkin_history_sum as (
select 
  user_id,
  sum(iff(datediff(DAY, uc.checkin_date, '2018-08-01') <= 7, 1, 0)) as visits_past_7_days,
  sum(iff(datediff(DAY, uc.checkin_date, '2018-08-01') <= 90, 1, 0)) as visits_past_90_days,
from user_checkin as uc
where uc.checkin_date < '2018-08-01'
group by user_id
order by user_id
)

Это дает мне результат

user_id | visits_past_7_days | visits_past_90_days
001       0                    2
002       0                    1

Мой вопрос: если у меня больше одного дня в качестве query_date, то есть у меня есть список checkin_date, для каждой checkin_date в списке я делаю запрос, как указано выше, и добавляю их все вместе.По сути, это циклическое + табличное добавление, но я не могу найти ответ, как это сделать на языке SQL.По сути, я хочу сделать следующее:

with user_checkin_history_sum as (
select 
  user_id,
  sum(iff(datediff(DAY, uc.checkin_date, query_date) <= 7, 1, 0)) as visits_past_7_days,
  sum(iff(datediff(DAY, uc.checkin_date, query_date) <= 90, 1, 0)) as visits_past_90_days,
from user_checkin as uc
where uc.checkin_date < query_date and
LOOP OVER
    query_date in ('2018-08-01', '2018-06-01')
group by user_id
order by user_id
)

И, надеюсь, это даст такой результат

user_id | query_date | visits_past_7_days | visits_past_90_days
001      '08-01-2018'  0                    2
002      '08-01-2018'  0                    1
001      '06-01-2018'  0                    1
002      '06-01-2018'  0                    2

1 Ответ

0 голосов
/ 27 сентября 2018

Вы сможете соединить таблицу, содержащую все даты, которые вы хотите проверить:

WITH dates AS (
    SELECT '2018-06-01' AS query_date UNION ALL
    SELECT '2018-08-01' UNION ALL
    ...     -- maybe other dates as well
),
user_checkin_history_sum AS (
    SELECT
        uc.user_id,
        d.query_date,
        SUM(IFF(DATEDIFF(DAY, uc.checkin_date, d.query_date) <= 7, 1, 0)) AS visits_past_7_days,
        SUM(IFF(DATEDIFF(DAY, uc.checkin_date, d.query_date) <= 90, 1, 0)) AS visits_past_90_days
    FROM dates d
    CROSS JOIN user_checkin AS uc
    WHERE uc.checkin_date < '2018-08-01'
    GROUP BY d.query_date, uc.user_id
    ORDER BY d.query_date, uc.user_id
)
...