У меня есть 2 таблицы, как показано ниже:
Таблица 1, таблица списка пользователей:
Year Month Id Type
2010 3 1 A
2010 5 2 B
2010 10 1 A
2010 12 1 A
В таблице 2 описана история продвижения пользователей:
Promote Date Id
2/20/2010 1
5/20/2010 1 (4/2010 the user got demoted, and after 1 month he got promote again)
Из этих двух таблиц мне нужно создать таблицу результатов, которая нравится таблице 1, но добавить столбец, который классифицирует пользователя с типом A, который был повышен за последние 3 месяца или более 3 месяцев в определенную дату. Например, результаты будут такими:
Year Month Id | Duration
2010 3 1 | A < 3 months
2010 10 1 | A > 3 months
2010 12 1 | A > 3 months
Общая идея была бы такой:
- Мне нужно преобразовать столбец месяца и столбца года из таблицы 1 в формат даты, например 3/2010
- вычтите новое преобразованное значение с ближайшей датой продвижения к указанной выше дате (2/2010), чтобы получить количество дней, в течение которых пользователь был продвинут
- сравните с 90 днями, чтобы определить продолжительность его повышения
Есть 2 проблемы, с которыми я сейчас застрял.
Я не знаю, как лучше всего преобразовать столбец месяца и столбца года в формат даты месяц / год.
Предполагая, что я уже преобразовал столбец месяца / года из таблицы 1, я использую функцию Max, чтобы получить ближайшую дату из таблицы 2. Насколько мне известно, функция max плохо сказывается на производительности, поэтому есть ли другое решение вместо использования max? В mysql это легко решить, используя Limit 1, но SAS proc-sql не поддерживает Limit. Есть ли эквивалент ограничения в proc-sql? Ниже приведен код, о котором я сейчас думаю.
PROC SQL;
Create table Result as SELECT table1.Year, table1.Month, table1.Code,
(Case When table1.Type = "B" then "B"
When table1.Type = "A" AND (table1.Date - (Select MAX(table2.Date) From table2 Where table2.Date <= table1.Date AND table2.Id = table1.Id ) < 90) THEN "A < 3 months"
When table1.Type = "A" AND (table1.Date - (Select MAX(table2.Date) From table2 Where table2.Date <= table1.Date AND table2.Id = table1.Id ) >= 90) THEN "A > 3 months"
When table1.Type = "C" then "C"
end) as NewType
From table1
LEFT JOIN
// ....
;
QUIT;
Как видите, мне нужно присоединиться к таблице table1 с другими таблицами, поэтому я использую подзапрос, который также является плохой производительностью, но я не знаю, есть ли другой способ. Помощь и совет приветствуются.