2017-07-19 174 views
0

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

例子:

客户表:

CustomerID customerName CustomerEmail monthDate SourceID 
1   Michael  NULL    1/1/2017  4 
2   Sarah   [email protected] 2/1/2017  2 
3   Dave   [email protected]  3/1/2017  1 
4   Sal   [email protected]  4/1/2017  4 
4   Sally   [email protected] 5/1/2017  4 
1   Mike S   [email protected] 5/1/2017  3 

参考表:

SourceID Priority 
1   2 
2   3 
3   4 
4   1 

4My选择查询会显示:

CustomerID customerName CustomerEmail 
1   Michael  [email protected] 
2   Sarah   [email protected] 
3   Dave   [email protected] 
4   Sally   [email protected] 

那么,一列有一个NULL值它将填充最高优先级值。如果有两个具有相同优先级的值,它将选择具有最近日期的值。必须在列级选择此选项才能获取每个字段的最新值。

任何帮助或正确方向的一个点将是伟大的。

感谢

回答

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; 
+0

这会不会只是选择整行最高“优先级”。我需要这个在列级别上工作。例如,如果一个客户(行1,2,3和4)有4行,它可以从行1中选择名称,从行2中选择电子邮件,从行3中选择电话号码等等? – alwaystrying