Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Join从满足条件的相同键值组中提取一对多值_Sql_Join_One To Many_Netezza - Fatal编程技术网

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

SQL Join从满足条件的相同键值组中提取一对多值,sql,join,one-to-many,netezza,Sql,Join,One To Many,Netezza,我有两个表,我正试图加入一对多的关系。父表具有与子表共享的唯一键值。子表保留该键的历史记录,因此有多条记录。下面的例子 我需要的是提取警报id的工作人员名称,其中,对于具有相同警报id的给定组,操作为“警报关闭”。如果具有相同警报id的组没有操作为“警报关闭”的记录,则获取具有最新时间戳的工作人员名称。我缺乏关于如何比较时间戳列的知识,而且当“警报关闭”为真时,我仍然会得到重复的时间戳列 表1 alert_id --------- 123 456

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

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

表1

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中的员工姓名。