SQL Join 一对多从满足条件的相同键值组中提取值

Posted

技术标签:

【中文标题】SQL Join 一对多从满足条件的相同键值组中提取值【英文标题】:SQL Join one to many extract value from group of same key value where condition is met 【发布时间】:2016-08-05 12:31:16 【问题描述】:

我正在尝试加入两个具有一对多关系的表。父表具有与子表共享的唯一键值。子表保留该键的历史记录,因此有多个记录。下面的例子。

我需要提取警报 id 的工作人员名称,其中对于具有相同警报 id 的给定组,操作为“警报已关闭”。如果该组相同的警报 id 没有 action = 'Alert Closed' 的记录,则使用具有最新时间戳的工作人员名称。我缺乏关于如何比较时间戳列的知识,当“警报关闭”为真时,我仍然会得到重复。

表一

alert_id            
---------
123         
456         
537         

表2

alert_id    worker_name action          timestamp
---------------------------------------------------------
123         system      Alert Created   8/6/2016  8:05:26 
123         james bond  Alert Opened    8/6/2016  8:05:30
123         james bond  Alert Closed    8/6/2016  8:05:35
123         james bond  Record updated  8/6/2016  8:05:35
456         system      Alert Created   8/6/2016  8:05:26
456         admin       Alert updated   8/6/2016  8:06:14
537         system      alert created   8/6/2016  8:07:20
537         Mary hill   Alert Closed    8/6/2016  8:08:26

结果表应该是:

alert_id    worker_name     
-----------------------
123         james bond      
456         admin       
537         Mary Hill       

【问题讨论】:

您使用的是哪个数据库? 这是 Sql Server 还是 mysql 等? netezza udb 如果有帮助的话 【参考方案1】:

这是一个优先级查询。您可以使用row_number() 来处理它。诀窍是正确排序:

select t2.*
from (select t2.*,
             row_number() over (partition by alert_id
                                order by (case when action = 'Alert Closed' then 1 else 2 end),
                                         timestamp desc
                               ) as seqnum
      from t2
     ) t2
where seqnum = 1;

【讨论】:

以上是关于SQL Join 一对多从满足条件的相同键值组中提取值的主要内容,如果未能解决你的问题,请参考以下文章

sql中的inner join ,left join ,right join

如何更有效地从n组中找到满足给定条件的最小组合?

SQL 语句 join where 如果一个条件不满足,则执行另一个条件

将所有键值组合成一个 NSMutableArray

如何根据键值组将字典拆分为多个字典?

sql 里面 join in 的差别,join的用法