我有与死亡有关的健康数据。个人应该最多死一次。在数据库中,他们有时不这样做;可能是因为死亡原因发生了变化,但原始条目没有被删除。我真的不明白这是怎么允许发生的,但它有。所以,作为一个例子,我有:
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。感激地收到任何想法。
答案 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;