У меня есть таблица с 3 значением
Date_key | user_name | user_id
2022-07-12 | milkcotton | 1
2022-09-12 | cereal | 2
2022-06-12 | musicbox1 | 3
2022-12-31 | harrybel1 | 1
2022-12-25 | milkcotton1| 4
2023-01-01 | cereal | 2
Я хочу знать пользователя, который изменил user_name в 1 семестре (01 июля 2022 г. - 31 декабря 2022 г.). Я могу сделать это? мое ожидаемое значение:
previous_name| new_name | user_id
milkcotton | harrybel1 | 1
Спасибо!
Узнать изменение имени пользователя из 1 таблицы
Примечание. Это делается в Postgres SQL. Это должно быть похоже на большинство движков SQL. Функции даты могут немного отличаться в других механизмах SQL.
Попробуй это:
with BaseTbl as(
select *,
cast(to_char(Date_key, 'YYYYMM') as int) as year_month,
cast(to_char(Date_key, 'MM') as int) as month,
row_number() over(partition by user_id order by date_key desc) as rnk
from Table1
),
LatestTwoChanges as(
select *
from BaseTbl
where user_id in (select user_id from BaseTbl where rnk=2 )
and rnk <=2
)
select
t2.user_name as previous_name,
t1.user_name as new_name,
t1.user_id
from LatestTwoChanges t1
join LatestTwoChanges t2
on t1.user_id=t2.user_id
where t1.rnk=1
and t2.rnk=2
and t1.year_month-t2.year_month <6
and t1.user_name <> t2.user_name
and (t1.month + t2.month <= 12 or t1.month + t2.month >=14 )
-- this is to check whether the date falling in the same semester.
Демонстрация скрипта SQL Здесь
Здесь таблица t1 содержит последние изменения, а таблица t2 содержит предыдущие изменения для user_id. Последнее условие фильтра
and (t1.month + t2.month <= 12 or t1.month + t2.month >=14 )
Заключается в том, чтобы убедиться, что эти две даты приходятся на один и тот же семестр или нет. что означает, что два месяца должны быть либо между 1 и 6, либо между 7 и 12.