2

我有一个名为 的表a,其他字段为eff_date,policy no.

eff_date现在对于每个策略,考虑所有记录,并从每个月取出最后更新的一个 ( )。

因此,我需要每个保单每个月的最后更新记录。我将如何为此编写查询?

4

4 回答 4

2

我不是 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 语法。

于 2013-06-18T16:44:28.523 回答
1
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
于 2013-06-19T05:26:50.680 回答
0

主要困难在于,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;
于 2013-06-18T16:38:18.750 回答
0

我将建议研究 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;
于 2013-06-19T04:06:36.240 回答