【问题标题】:To find the last updated record of each month for each policy(another field)查找每个保单每个月的最后更新记录(另一个字段)
【发布时间】:2013-06-19 13:26:50
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的是什么 RDBMS 和版本?
  • 这适用于哪个 RDBMS?通过月份和 policy_no 的组合提取月份和组非常重要。

标签: sql greatest-n-per-group teradata


【解决方案1】:

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

【讨论】:

  • 嗯,我对 Teradata 不是很熟悉,你能正常运行内部查询吗?
  • SELECT *, ROW_NUMBER() OVER (PARTITION BY policy_no, EXTRACT(YEAR FROM eff_dt),EXTRACT(MONTH FROM eff_dt) ORDER BY eff_dt DESC) FROM a
  • 如果您列出字段而不是使用 * 会怎样?
  • ROW_NUMBER() 是一个添加数字的函数,例如对每个结果行进行排名。
  • 这是检索一个月的所有日期。我不仅得到一个月的最后更新日期记录。并且政策编号也显示为 1、2、3 等。不是原始政策编号
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    主要的难点是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;
    

    【讨论】:

    • 从问题中我认为 op 想要每个策略每月最后更新的行(如每一列)。不仅仅是最大日期。
    • 谢谢,已解决。
    • 并非如此。当我相信他想要那个最大值eff_date整个 行时,你仍然只是取eff_date 的最大值。这是在 Goat_CO 的回答中完成的
    • @user2497982,我已更新我的查询以使用派生表的连接提供所有信息。
    • 抛出错误“派生表中的所有表达式都必须具有明确的名称”
    【解决方案4】:

    我将建议研究 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;
    

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 2021-01-23
      • 2021-10-04
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2017-02-19
      相关资源
      最近更新 更多