#mysql #mysql-5.7
Вопрос:
У меня есть таблица, структурированная так.
Идентификатор пользователя | Тип подписки | отметка времени |
---|---|---|
100 | платеж | 2/10/2021 |
99 | пробный | 2/10/2021 |
100 | пробный | 15/9/2021 |
Я хочу, чтобы мои выходные данные были такими же, с дополнительной колонкой, отображающей дату начала пробной версии, когда подписчик преобразуется в платную подписку.
Идентификатор пользователя | Тип подписки | отметка времени | Trial_Start_date |
---|---|---|---|
100 | платеж | 2/10/2021 | 15/9/2021 |
99 | пробный | 2/10/2021 | |
100 | пробный | 2/10/2021 |
На данный момент у меня есть такой запрос:
SELECT *,
CASE WHEN
(SELECT `subscription_type` FROM subscription_event se1
WHERE se1.`timestamp` < se.`timestamp` AND se1.user_id = se.user_id
ORDER BY user_id DESC LIMIT 1) = 'TRIAL'
then se1.`timestamp` else 0 end as "Converted_from_TRIAL"
FROM subscription_event se
У меня сообщение об ошибке с se1. timestamp
не определено. Я понимаю, почему, но я не вижу обходного пути.
Какой-нибудь указатель?
Комментарии:
1. Почему это
timestamp
в последней строке результата2/10/2021
? Разве это не должно быть15/9/2021
так, как в таблице ввода?
Ответ №1:
Если вам нужно получить два значения из подзапроса, вы должны присоединиться к нему, а не использовать его в качестве выражения.
SELECT se.*,
MAX(se1.timestamp) AS Converted_from_TRIAL
FROM subscription_event AS se
LEFT JOIN subscription_event AS se1 ON se.user_id = se1.user_id AND se1.timestamp < se.timestamp AND se1.subscription_type = 'TRIAL'
GROUP BY se.user_id, se.subscription_type, se.timestamp
Ответ №2:
Большое спасибо! По некоторым причинам мне нужно было явно объявить в SELECT переменные, используемые в ГРУППЕ BY . Не знаю, почему ( я использую MySQL5.7, так что, возможно, это связано с этим). В любом случае, это рабочий запрос.
SELECT se.user_id, se.subscription_type, se.timestamp,
MAX(se1.timestamp) AS Converted_from_TRIAL
FROM subscription_event AS se
LEFT JOIN subscription_event AS se1 ON se.user_id = se1.user_id AND se1.timestamp < se.timestamp AND se1.subscription_type = 'TRIAL'
GROUP BY se.user_id, se.subscription_type, se.timestamp