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