我有一个名为 的表a
,其他字段为eff_date,policy no
.
eff_date
现在对于每个策略,考虑所有记录,并从每个月取出最后更新的一个 ( )。
因此,我需要每个保单每个月的最后更新记录。我将如何为此编写查询?
我有一个名为 的表a
,其他字段为eff_date,policy no
.
eff_date
现在对于每个策略,考虑所有记录,并从每个月取出最后更新的一个 ( )。
因此,我需要每个保单每个月的最后更新记录。我将如何为此编写查询?
我不是 100% 了解 Teradata 语法,但我相信你在这之后:
SELECT policy_no,eff_date
FROM (SELECT policy_no,eff_date, ROW_NUMBER() OVER (PARTITION BY policy no, EXTRACT(YEAR FROM eff_date),EXTRACT(MONTH FROM eff_date) ORDER BY eff_date DESC) as RowRank
FROM a) as sub
WHERE RowRank = 1
我假设当您按月说时,您还想按年区分,但如果不是,只需从 PARTITION BY 部分中删除 EXTRACT(YEAR FROM eff_date) 。
编辑:更新 Teradata 语法。
SELECT * from a
qualify ROW_NUMBER() OVER (PARTITION BY policy no, EXTRACT(YEAR FROM eff_date),
EXTRACT(MONTH FROM eff_date) ORDER BY eff_date DESC) = 1
主要困难在于,group by
需要同时结合policy_no,以及月份(从日期中提取)。例如:
在 Mysql 中
SELECT policy_no,
month(eff_date),
year(eff_date),
max(eff_date)
FROM myTable
GROUP BY policy_no,
month(eff_date),
year(eff_date);
我看到 teradata 中允许派生表。使用与派生表的连接,以下是访问完整行的方法:
select * from a,
(SELECT policy_no,
month(eff_date),
year(eff_date),
max(eff_date) as MaxMonthDate
FROM a
GROUP BY policy_no,
month(eff_date),
year(eff_date)
) as b
where a.policy_no = b.policy_no and
a.eff_date = b.MaxMonthDate;
http://www.sqlfiddle.com/#!2/1f728/5
select * from a,
(SELECT a2.policy_no,
EXTRACT(MONTH FROM a2.eff_date),
EXTRACT(YEAR FROM a2.eff_date),
max(a2.eff_date) as MaxMonthDate
FROM a as a2
GROUP BY a2.policy_no,
EXTRACT(MONTH FROM a2.eff_date),
EXTRACT(YEAR FROM a2.eff_date)
) as b
where a.policy_no = b.policy_no and
a.eff_date = b.MaxMonthDate;
我将建议研究 Windows 聚合函数和 QUALIFY 语句。我相信下面的 SQL 会起作用。
SELECT Policy_No
, EXTRACT(MONTH FROM Eff_Date) AS Eff_Month_
, Eff_Date
FROM TableA
QUALIFY ROW_NUMBER() OVER (PARTITION BY Policy_No, EXTRACT(MONTH FROM Eff_Date)
ORDER BY Eff_Date DESC) = 1;