SQL нахождение количества пользователей в последовательных месяцах в таблице - PullRequest
0 голосов
/ 06 мая 2020

У меня есть таблица со следующими столбцами

email        ----        created at
abc@gmail.com        2019-12-12 16:03:34
rp@gamil.com         2019-11-12 16:03:34
abc@gmail.com        2020-1-12 16:03:34
er@gmail.com         2020-1-12 16:03:34

Я хочу разработать запрос, который возвращает обратное количество электронных писем, зарегистрированных за 2 месяца подряд. Я не новичок в запросах и изо всех сил пытаюсь придумать запрос для этого.

Для вышеупомянутого запроса abc@gmail.com был зарегистрирован дважды за несколько месяцев подряд

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Выполняя самостоятельное соединение для Month + 1 и email (а также принимая во внимание переходы с декабря на январь), это должно сработать:

SELECT
    *
FROM
    (
        SELECT
            email,
            YEAR( created ) AS createdYear,
            MONTH( created ) AS createdMonth
        FROM
            table
    ) AS t

    INNER JOIN
    (
        SELECT
            email,
            YEAR( created ) AS createdYear,
            MONTH( created ) AS createdMonth
        FROM
            table
    ) AS monthPlus1 ON 
        t.email = monthPlus1.email
        AND
        (
            (
                t.createdMonth = monthPlus1.createdMonth + 1
                AND
                t.createdYear = monthPlus1.createdYear
            )
            OR
            (
                t.createdMonth = 12
                AND
                monthPlus1.createdMonth = 1
                AND
                t.createdYear + 1 = monthPlus1.createdYear
            )
        )

Дата logi c в этот запрос немного корявый - его, вероятно, можно улучшить, представив месяц как одно значение date или целое число месяцев с начала эпохи c, а не как кортеж year + month.

0 голосов
/ 06 мая 2020

Вы можете использовать lag(). Если это произойдет, то lag() будет через два соседних месяца.

select t.email
from (select t.*
             lag(created_at) over (partition by t.email order by created_at) as prev_created_at
      from t
     ) t
where extract(year_month from created_at) = extract(year_month from (prev_created_at + interval 1 month));

Вам может понадобиться select distinct, если это может происходить несколько раз.

0 голосов
/ 06 мая 2020

Вы можете использовать запрос EXISTS, чтобы проверить, существует ли электронное письмо, которое также было зарегистрировано в предыдущем месяце:

SELECT DISTINCT email
FROM yourtable t1
WHERE EXISTS (SELECT *
              FROM yourtable t2
              WHERE t2.email = t1.email 
                AND DATE_FORMAT(t2.createdat, '%Y%m') = DATE_FORMAT(t1.createdat - INTERVAL 1 MONTH, '%Y%m'))

Вывод для ваших данных образца

abc@gmail.com

Демонстрация на dbfiddle

Мы используем DISTINCT, поэтому мы не получаем несколько копий одного и того же электронного письма, если адрес электронной почты зарегистрирован более одного месяца подряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...