【问题标题】:I have a column in table named "client_name".... i need to select column value from last row in my join query我在表中有一个名为“client_name”的列......我需要从我的联接查询的最后一行中选择列值
【发布时间】:2020-01-06 07:38:19
【问题描述】:

我有一个列名为 policy_refer、客户名称和 issue_date 的表

policy_refer    Client_Name   issue_date(entry_date)
0001             Ajaz         01-Jan-2019
0001             Ajaz         05-Jan-2019
0001             Anita        10-Jan-2019

我想在我的选择/加入查询中选择最后一次更新/插入 client_name where policy_refer = 0001 ....

select policy_master.CLIENT_NAME
      ,POLICY_INSURER_DETAIL.INSURER_NAME
      ,POLICY_INSURER_DETAIL.INSURER_BRANCH
      ,POLICY_INSURER_DETAIL.policy_number
      ,policy_master.policy_refer
      ,policy_master.POLICY_CLASS
      ,policy_master.POLICY_PRODUCT
      ,policy_master.P_ISSUE_DATE
      ,policy_master.EXPIRY_DATE
      ,sum(policy_master.TOTAL_SUMINSURED)
      ,sum(policy_master.GROSS)
      ,sum(policy_master.PERMIUM)
from POLICY_MASTER,POLICY_INSURER_DETAIL
where policy_master.policy_refer = POLICY_INSURER_DETAIL.POLICY_REFER
and POLICY_MASTER.POL_ID = POLICY_INSURER_DETAIL.POL_ID
and POLICY_MASTER.EXPIRY_DATE ='19-AUG-20'
and POLICY_MASTER.DOC_STATUS ='Posted'
group by POLICY_MASTER.policy_refer
        ,POLICY_INSURER_DETAIL.INSURER_NAME
        ,POLICY_INSURER_DETAIL.INSURER_BRANCH
        ,POLICY_INSURER_DETAIL.policy_number
        ,policy_master.policy_refer
        ,policy_master.EXPIRY_DATE
        ,policy_master.CLIENT_NAME
        ,policy_master.POLICY_CLASS
        ,policy_master.POLICY_PRODUCT
        ,policy_master.P_ISSUE_DATE;

【问题讨论】:

  • 你从上面的查询得到什么结果?
  • 我得到了 client_name Ajaz.. 但最后一个 client_name 是 Anita .. 根据发布日期
  • 请不要显着改变您的问题。如果您想问一个不同的问题,请在另一个问题中提出,而不是覆盖您现有的问题。

标签: join select oracle11g greatest-n-per-group


【解决方案1】:

一个选项是找出哪个是第一个(使用分析函数),然后获取该行。例如:

select column_list_goes_here
from (
        --> this is your current query, with the ROW_NUMBER addition
        select all your columns here,
        --
        row_number() over (partition by policy_refer order by issue_date desc) rn
        --
      from your_tables
      where ...
      group by ...
      --> end of your current query
      )
where rn = 1      

【讨论】:

    【解决方案2】:

    您正在谈论的表格似乎是 POLICY_MASTER 表格,并且您想要每个策略的最新行(ISSUE_DATE)。

    然后你想过滤这样的东西:

    select pm.CLIENT_NAME
          ,POLICY_INSURER_DETAIL.INSURER_NAME
          ,POLICY_INSURER_DETAIL.INSURER_BRANCH
          ,POLICY_INSURER_DETAIL.policy_number
          ,pm.policy_refer
          ,pm.POLICY_CLASS
          ,pm.POLICY_PRODUCT
          ,pm.P_ISSUE_DATE
          ,pm.EXPIRY_DATE
          ,sum(pm.TOTAL_SUMINSURED)
          ,sum(pm.GROSS)
          ,sum(pm.PERMIUM)
    from   (
             SELECT *
             FROM   (
               SELECT POL_ID,
                      CLIENT_NAME,
                      policy_refer,
                      POLICY_CLASS,
                      POLICY_PRODUCT,
                      P_ISSUE_DATE,
                      EXPIRY_DATE,
                      TOTAL_SUMINSURED,
                      GROSS,
                      PERMIUM,
                      ROW_NUMBER() OVER ( PARTITION BY policy_refer /*, pol_id */
                                          ORDER BY ISSUE_DATE DESC ) AS rn
               FROM   POLICY_MASTER
               WHERE  EXPIRY_DATE = DATE '2020-08-19'
               AND    DOC_STATUS  ='Posted'
             )
             WHERE rn = 1
           ) pm
           INNER JOIN POLICY_INSURER_DETAIL pid
           ON (     pm.policy_refer = pid.POLICY_REFER
                AND pm.POL_ID       = pid.POL_ID )
    GROUP BY pm.policy_refer
            ,pid.INSURER_NAME
            ,pid.INSURER_BRANCH
            ,pid.policy_number
            ,pm.policy_refer
            ,pm.EXPIRY_DATE
            ,pm.CLIENT_NAME
            ,pm.POLICY_CLASS
            ,pm.POLICY_PRODUCT
            ,pm.P_ISSUE_DATE;
    

    【讨论】:

    • 查询 ----ORA-00904: "PM"."POL_ID": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause: *Action: Error at Line: 35栏目:17
    • @EjazSarwar 您没有为您的表提供任何示例数据或 DDL 语句,因此很难测试。但是,如果您查找 pm 表别名并找到表示的子查询并查看查询中是否有 POL_ID 列(没有,但我现在已经编辑了它)然后您可以自己调试该错误。
    • 你能告诉我如何获得更高的行吗
    【解决方案3】:

    我猜你需要从发布日期降序排序后的第一行 -

    select policy_master.CLIENT_NAME
          ,POLICY_INSURER_DETAIL.INSURER_NAME
          ,POLICY_INSURER_DETAIL.INSURER_BRANCH
          ,POLICY_INSURER_DETAIL.policy_number
          ,policy_master.policy_refer
          ,policy_master.POLICY_CLASS
          ,policy_master.POLICY_PRODUCT
          ,policy_master.P_ISSUE_DATE
          ,policy_master.EXPIRY_DATE
          ,sum(policy_master.TOTAL_SUMINSURED)
          ,sum(policy_master.GROSS)
          ,sum(policy_master.PERMIUM)
    from POLICY_MASTER,POLICY_INSURER_DETAIL
    where policy_master.policy_refer = POLICY_INSURER_DETAIL.POLICY_REFER
    and POLICY_MASTER.POL_ID = POLICY_INSURER_DETAIL.POL_ID
    and POLICY_MASTER.EXPIRY_DATE ='19-AUG-20'
    and POLICY_MASTER.DOC_STATUS ='Posted'
    and rownum = 1
    group by POLICY_MASTER.policy_refer
            ,POLICY_INSURER_DETAIL.INSURER_NAME
            ,POLICY_INSURER_DETAIL.INSURER_BRANCH
            ,POLICY_INSURER_DETAIL.policy_number
            ,policy_master.policy_refer
            ,policy_master.EXPIRY_DATE
            ,policy_master.CLIENT_NAME
            ,policy_master.POLICY_CLASS
            ,policy_master.POLICY_PRODUCT
            ,policy_master.P_ISSUE_DATE
    ORDER BY P_ISSUE_DATE DESC; 
    

    【讨论】:

    • ROWNUM 在应用ORDER BY 之前生成。您的查询将不起作用,因为它将返回第一行,然后它将对该单行进行排序(而不是先对行进行排序,然后再获取第一行)。
    • @MT0,同意。太着急了。
    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 2020-10-15
    • 1970-01-01
    • 2020-01-16
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多