SQL Join从满足条件的相同键值组中提取一对多值
我有两个表,我正试图加入一对多的关系。父表具有与子表共享的唯一键值。子表保留该键的历史记录,因此有多条记录。下面的例子 我需要的是提取警报id的工作人员名称,其中,对于具有相同警报id的给定组,操作为“警报关闭”。如果具有相同警报id的组没有操作为“警报关闭”的记录,则获取具有最新时间戳的工作人员名称。我缺乏关于如何比较时间戳列的知识,而且当“警报关闭”为真时,我仍然会得到重复的时间戳列 表1SQL Join从满足条件的相同键值组中提取一对多值,sql,join,one-to-many,netezza,Sql,Join,One To Many,Netezza,我有两个表,我正试图加入一对多的关系。父表具有与子表共享的唯一键值。子表保留该键的历史记录,因此有多条记录。下面的例子 我需要的是提取警报id的工作人员名称,其中,对于具有相同警报id的给定组,操作为“警报关闭”。如果具有相同警报id的组没有操作为“警报关闭”的记录,则获取具有最新时间戳的工作人员名称。我缺乏关于如何比较时间戳列的知识,而且当“警报关闭”为真时,我仍然会得到重复的时间戳列 表1 alert_id --------- 123 456
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
这是一个优先级查询。您可以使用
row\u 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;
这是一个优先级查询。您可以使用
row\u 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 Server还是MySql等?netezza udb,如果它有助于您使用的是哪个数据库?这是Sql Server还是MySql等?netezza udb,如果它有助于我,我只需将其左外部与表1右连接,因为我只需要从表2中输入员工姓名。然后我只需将其左外部与表1右连接即可因为我只需要表2中的员工姓名。