Другой способ выполнения задания - использовать аналитическую функцию MAX () в предложении OVER PARTITION
SELECT t.*
FROM
(
SELECT id
,rev
,contents
,MAX(rev) OVER (PARTITION BY id) as max_rev
FROM YourTable
) t
WHERE t.rev = t.max_rev
. Другое решение OVER PARTITION, уже зарегистрированное в этом сообщении, -
SELECT t.*
FROM
(
SELECT id
,rev
,contents
,ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rank
FROM YourTable
) t
WHERE t.rank = 1
Этот 2 SELECT хорошо работает на Oracle 10g.
Вы можете использовать DateOffset
для достижения этого:
In [15]:
df['NEW_DATE'] = df['ACC_DATE'].apply(lambda x: x - pd.DateOffset(years=1))
df
Out[15]:
ACC_DATE NEW_DATE
index
538 2006-04-07 2005-04-07
550 2006-04-12 2005-04-12
update
Глядя на этот вопрос через 3 года, используя apply
, вы можете просто сделать:
In[88]:
df['NEW_DATE'] = df['ACC_DATE'] - pd.DateOffset(years=1)
df
Out[88]:
ACC_DATE NEW_DATE
index
538 2006-04-07 2005-04-07
550 2006-04-12 2005-04-12
, который является векторизованной операцией
Использовать DateOffset :
df["NEW_DATE"] = df["ACC_DATE"] - pd.offsets.DateOffset(years=1)
print (df)
ACC_DATE NEW_DATE
index
538 2006-04-07 2005-04-07
550 2006-04-12 2005-04-12
Вы можете использовать pd.Timedelta:
df["NEW_DATE"] = df["ACC_DATE"] - pd.Timedelta(days=365)
Или заменить:
df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x.replace(year=x.year - 1))
Но ни один из них не будет ловить високосные годы, чтобы вы могли использовать dateutil.relativedelta
:
from dateutil.relativedelta import relativedelta
df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x - relativedelta(years=1))