SQL Server:多行忽略一些并返回其他行

时间:2013-06-06 14:34:06

标签: sql sql-server sql-server-2005

下午好,伙计们,

我有一个数据库表,其中包含有关员工疾病的数据。它看起来像这样。

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

1 个答案:

答案 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()