1

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

 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。视窗XP。任何想法都感激不尽。

4

3 回答 3

0

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

select * from (
       select T.*, row_number() over (partition by Individual_ID) as r
           from T
   )
   where r=1;
于 2012-08-13T14:19:57.363 回答
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。

于 2012-08-13T12:21:06.033 回答
0

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

SELECT IndividualID, MIN(Cause_Of_Death), MIN (Date_Of_Death)
from deaths
GROUP BY IndividualID
于 2012-08-13T12:16:33.790 回答