从重复项中任意选择特定列的不同值

时间:2012-08-13 12:08:33

标签: sql db2

我有与死亡有关的健康数据。个人应该最多死一次。在数据库中,他们有时不这样做;可能是因为死亡原因发生了变化,但原始条目没有被删除。我真的不明白这是怎么允许发生的,但它有。所以,作为一个例子,我有:

 Row_number | Individual_ID | Cause_of_death        | Date_of_death
------------+---------------+-----------------------+---------------
     1      |     1         | Stroke                | 3 march 2008     
     2      |     2         | Myocardial infarction | 1 jan 2009  
     3      |     2         | Pulmonary Embolus     | 1 jan 2009

我希望每个人只有一个死因。

在示例中,我想要一个返回第1行以及第2行或第3行(不是两者)的查询。我必须在第2行和第3行之间做出任意选择,因为在任何字段中都没有时间戳可用于确定哪个是修订版;它不理想,但不可避免。

我无法使SQL工作。我已经尝试将不同的Individual_ID内部连接到其他字段,但这仍然提供所有行。我尝试用它添加'having count(Individual_ID)= 1'子句。这完全消除了人们死亡的原因。互联网上的建议似乎是基于使用带时间戳的字段来选择最新的,但我没有。

IBM DB2。 Windows XP。感激地收到任何想法。

3 个答案:

答案 0 :(得分:0)

您是否尝试过使用MIN(或MAX)来对抗死因。 (以及死亡日期,如果他们在两个不同日期去世)

SELECT IndividualID, MIN(Cause_Of_Death), MIN (Date_Of_Death)
from deaths
GROUP BY IndividualID

答案 1 :(得分:0)

我不懂DB2,所以我会回答一下。主要有两种方法:

select *
from T
join (
 select keys, min(ID) as MinID
 from T
 group by keys
) on T.ID = MinID

select *, row_number() over (partition by keys) as r
from T
where r = 1

两者都返回所有行,无论是否重复。但是每个“密钥”只返回一个副本。

请注意,这两个语句都是伪SQL。

答案 2 :(得分:0)

从性能角度来看,row_number()方法可能更可取。这是usr的例子,在DB2语法中:

select * from (
       select T.*, row_number() over (partition by Individual_ID) as r
           from T
   )
   where r=1;