下午好,伙计们,
我有一个数据库表,其中包含有关员工疾病的数据。它看起来像这样。
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
如果您发现ID 00005590
有两个条目,一个用于工作(它们被安排),另一个用于说他们打电话给病人。因此,如果我查询该用户的数据库,我会得到两行或结果。
我想做的只是如果病人生病并且忽视他们的工作结果,只返回生病排,所以我最终得到......
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
答案 0 :(得分: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
子句)。包含“sick”的行被赋值为1(如果存在);否则,将分配“工作”行1.过滤器仅占用第一行。
请注意,每个id只返回一行。如果您有多个“工作”或“生病”行,则可以使用rank()
代替row_number()
。