找出医院内共有多少人?
create table hospital (
emp_id int
, action varchar(10)
, time datetime
);
insert into hospital values ('1', 'in', '2019-12-22 09:00:00');
insert into hospital values ('1', 'out', '2019-12-22 09:15:00');
insert into hospital values ('2', 'in', '2019-12-22 09:00:00');
insert into hospital values ('2', 'out', '2019-12-22 09:15:00');
insert into hospital values ('2', 'in', '2019-12-22 09:30:00');
insert into hospital values ('3', 'out', '2019-12-22 09:00:00');
insert into hospital values ('3', 'in', '2019-12-22 09:15:00');
insert into hospital values ('3', 'out', '2019-12-22 09:30:00');
insert into hospital values ('3', 'in', '2019-12-22 09:45:00');
insert into hospital values ('4', 'in', '2019-12-22 09:45:00');
insert into hospital values ('5', 'out', '2019-12-22 09:40:00');
我的解决方案
select emp_id, max(time) as total_in
from hospital
where action = 'in'
group by emp_id
having max(time) > ANY (
select emp_id, max(time)
from hospital
where action = 'Out'
group by emp_id
);
请向我解释为什么会出现此错误
当子查询不带 EXISTS 引入时,选择列表中只能指定一个表达式。
在 SQL Server 中运行上述查询时,即使我使用 ANY 多行运算符和子查询。
答案应为 emp_id 2,3,4。
看起来您需要将每个员工的最新(最大)“入”时间与最近(最大)“出”时间进行比较。我希望您还需要处理给定员工有“输入”行但没有“输出”行的情况。
有几种方法可以做到这一点。
一种是建立两个子选择,一个用于“in”,一个用于“out”,在
emp_id
上将它们连接起来,并比较时间。
select I.emp_id, I.latest_in
from (
select emp_id, max(time) as latest_in
from hospital
where action = 'In'
group by emp_id
) I
left join (
select emp_id, max(time) as latest_out
from hospital
where action = 'Out'
group by emp_id
) O ON O.emp_id = I.emp_id
where (I.latest_in > O.latest_out or O.latest_out is null);
另一种方法是使用条件聚合来计算同一子查询中的最新入和最新出。 条件聚合 只是在聚合函数中放置一个条件
IIF()
函数或 CASE
表达式 - 在本例中为 MAX()
。如果条件返回一个值,则该值包含在聚合中。如果不存在,则显式或隐式 NULL 将被忽略。
select IO.emp_id, IO.latest_in
from (
select
emp_id,
max(case when action = 'In' then time end) as latest_in,
max(case when action = 'Out' then time end) as latest_out
from hospital
group by emp_id
) IO
where (IO.latest_in > IO.latest_out or IO.latest_out is null);