【问题标题】:How to use case on group by result in Oracle-sql如何在Oracle-sql中按结果分组使用案例
【发布时间】:2014-05-22 09:59:01
【问题描述】:

我有一个包含以下列的表格

person_id Person_Name Telephone_No City Email_Id Insert_TS

还有某些其他列,例如 Alternate_name 等。 在此表中,只要在任何特定行中有任何更新,就会插入一行。例如

P01 Radhe 0112311231 Bia b@b.com 09-NOV-2012 15:24:38 
P01 Radhe Null  Bia    a@b.com  30-APR-2014 21:26:51 
P02 Shayam 456897845 Albi s@b.com 30-APR-2014 14:36:03
P03 Radha Null xyz   s1@b.com 31-APR-2014 14:36:03

意味着,电话字段中很少有记录包含空值,但所有其他字段都有数据

我想显示 person_id Person_Name Telephone_No City Email_Id 列,这样如果有任何行包含与一个 person_id 相对应的 phone_no 值非空值,那么应该显示最新记录 别的 应显示此人的最新记录

总结显示唯一的person_id和最新的telephone_no对于那些没有telephone_no最新记录的人应该显示。

我试过这样:

用最新的telephone_no 获取唯一的person_id -- A 获取所有具有最新记录的唯一 person_id --- B

将数据显示为 (B-A) + A 。

但这需要太多时间,而且似乎效率不高。 请建议一个查询以更快地获取记录

其他可能的方法是按结果分组使用 case 语句,例如按 Person_id 对值进行分组,如果每个组中有任何电话号码,则显示具有最新值的那个,否则显示组中的最新条目

【问题讨论】:

    标签: sql oracle join group-by case


    【解决方案1】:

    总是显示每个人的最后一行还不够吗?假设 person_id,Insert_TS 是唯一的:

    select person_id, max(Insert_TS)
    from T
    group by person_id
    

    然后将其与表格连接以获取所有信息。

    对于最新版本的 oracle,您可以使用 row_number(),如

    select ... 
    from (
        select ..., row_number() over (partition by person_id
                                       order by Insert_TS desc) as rn
    ) as x
    where rn = 1;
    

    我不确定我是否完全理解,但可以试一试。我从 SQLFiddle for Oracle 收到错误,我自己无权访问 Oracle,因此在 DB2 V10.5 上测试了以下内容。我通过删除几列进行了一些简化。此外,时间戳与您的不同:

    with tmp as (select PERSON_ID, PERSON_NAME, TELEPHONE_NO, INSERT_TS
                ,row_number() over (partition by person_id 
                                    order by insert_ts desc) as rn 
                from t) 
    select * from tmp x 
    where rn = (
        select coalesce(min(rn),1) 
        from tmp y 
        where x.person_id = y.person_id 
          and y.TELEPHONE_NO is not null
    );
    
    PERSON_ID PERSON_NAME TELEPHONE_NO    INSERT_TS                  RN                  
    --------- ----------- --------------- -------------------------- --------------------
    P01       Radhe       011231123109    2012-05-22-14.27.35.037579                    2
    P02       Shayam      456897845       2014-05-22-14.27.35.037579                    1
    P03       Radha       -               2014-06-22-14.27.35.037579                    1
    
    3 record(s) selected.
    

    【讨论】:

    • 感谢回复 最新行可能不包含前行中插入的同一个人 id 的信息。例如,如果电子邮件 id 而不是电话号码发生了变化,那么最新的行可能不包含有关电话号码的详细信息
    • 好的,那么每列的最后一个非空值就足够了吗?
    • 没有,因为没有电话没有价值的人很少
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2021-05-24
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多