【问题标题】:Selecting column values base on a priority reference table?根据优先级参考表选择列值?
【发布时间】:2017-07-19 12:15:59
【问题描述】:

我想创建一个选择查询,它将根据参考表中设置的优先级为每一列选择值。如果一列有多个值,它将使用日期字段选择最新的。

例子:

客户表:

CustomerID   customerName   CustomerEmail    monthDate    SourceID
1            Michael        NULL             1/1/2017     4
2            Sarah          Sarah@email.com  2/1/2017     2
3            Dave           Dave@no.com      3/1/2017     1
4            Sal            Sal@mail.com     4/1/2017     4
4            Sally          Sall@emai.com    5/1/2017     4
1            Mike S         Mike.s@em.com    5/1/2017     3

参考表:

SourceID   Priority
1          2
2          3
3          4
4          1

4我的选择查询会显示:

CustomerID   customerName   CustomerEmail
1            Michael        Mike.s@em.com
2            Sarah          Sarah@email.com
3            Dave           Dave@no.com
4            Sally          Sall@emai.com

因此,当列具有 NULL 值时,它将填充最高优先级值。如果有两个具有相同优先级的值,它将选择具有最近日期的值。这必须在列级别进行选择,以获得每个字段的最新值。

任何帮助或正确方向的观点都会很棒。

谢谢

【问题讨论】:

    标签: sql database netezza


    【解决方案1】:

    使用join 将表放在一起并获得优先级。然后您可以使用row_number()为每个客户选择“第一”:

    select c.*
    from (select c.*,
                 row_number() over (partition by c.customerid
                                    order by r.priority desc, monthdate desc
                                   ) as seqnum
          from customer c join
               reference r
               on c.sourceid = r.sourceid
         ) c
    where seqnum = 1;
    

    【讨论】:

    • 这不会只选择具有最高“优先级”的整行。我需要这个在列级别工作。例如,如果一个客户有 4 行(第 1、2、3 和 4 行),它可以从第 1 行中选择姓名,从第 2 行中选择电子邮件,从第 3 行中选择电话号码等等?
    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2015-05-04
    • 2017-05-01
    相关资源
    最近更新 更多