0

皆さん、こんにちは。

従業員の病気に関するデータを含むデータベース テーブルがあります。このように見えます。

Date                     ID        State
2013-05-03 00:00:00      0002371   Working
2013-05-03 00:00:00      0002622   Working
2013-05-03 00:00:00      0005590   Working
2013-05-03 00:00:00      0005590   Sick

ID00005590に 2 つのエントリがあり、1 つは勤務中 (予定されていた)、もう 1 つは病気で電話したことを示すものです。したがって、そのユーザーのデータベースにクエリを実行すると、2 つの行または結果が得られます。

私がやりたいのは、その人が病気だった場合にのみ病気の行を返し、彼らの作業結果を無視することです.

Date                     ID        State
2013-05-03 00:00:00      0002371   Working
2013-05-03 00:00:00      0002622   Working
2013-05-03 00:00:00      0005590   Sick

SQL Server 2005 を実行しています。

女性と男性のアイデアはありますか?

とても有難い。

D

4

1 に答える 1

2

row_number()と でこれを行うことができますcase

select [date], id, state
from (select t.*,
             row_number() over (partition by id
                                order by (case when state = 'Sick' then 1 else 0 end) desc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

これが行うことは、(節idに基づいて)それぞれに連続番号を割り当てることです。partition by「病気」を含む行には、値 1 が割り当てられます (存在する場合)。それ以外の場合は、「作業中」の行に 1 が割り当てられます。フィルターは最初の行のみを取得します。

これは、ID ごとに 1 つの行のみを返すことに注意してください。「作業中」または「病気」の行が複数ある可能性がある場合は、rank()代わりにrow_number().

于 2013-06-06T14:36:58.340 に答える