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有两个条目,一个用于工作(他们被安排)然后另一个说他们打电话请病假。因此,如果我查询该用户的数据库,我会得到两行或结果。

我想做的只是在这个人生病的情况下返回病房并忽略他们的工作结果,所以我最终......

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()and做到这一点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().

于 2013-06-06T14:36:58.340 回答