1

死亡に関する健康データがあります。個人は最大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 つだけにしたいと考えています。

この例では、行 1 と、行 2 または行 3 のいずれか (両方ではない) を返すクエリが必要です。行 2 と行 3 の間で任意の選択を行う必要があります。これは、どちらがリビジョンであるかを判断するために使用できるタイムスタンプがどのフィールドにもないためです。理想的ではありませんが、避けられません。

これを行うためにSQLを機能させることはできません。個別の Individual_ID を他のフィールドに内部結合しようとしましたが、それでもすべての行が得られます。「having count(Individual_ID) = 1」句を追加してみました。これにより、死因が複数ある人は完全に除外されます。インターネット上の提案は、タイムスタンプ付きフィールドを使用して最新のものを選択することに基づいているようですが、私はそれを持っていません.

IBM DB2。WindowsXP. どんな考えもありがたく受け取った。

4

3 に答える 3

0

私はDB2を知らないので、一般的に答えます。主なアプローチは 2 つあります。

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

どちらも、重複しているかどうかに関係なく、すべての行を返します。ただし、「キー」ごとに 1 つの重複のみが返されます。

両方のステートメントが疑似 SQL であることに注意してください。

于 2012-08-13T12:21:06.033 に答える
0

パフォーマンスの観点からは、おそらく row_number() アプローチが望ましいでしょう。DB2 構文での usr の例を次に示します。

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

死因に対してMIN(または)を使用してみましたか。MAX(死亡日が異なる場合は死亡日)

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