我有一张桌子,我想从中找到第一条记录,其中包含一段IN(' B410',' B420',' C430',& #39; C440&#39)。因此,我认为这意味着要查找具有最早日期的记录,并在最旧的日期内查找具有最早时间戳的记录。
我用2个嵌套的子查询编写了一个查询,但是该查询没有做到这一点(它给了我一个空结果)。我究竟做错了什么?奇怪的是,当更改语法以找到max(fromdate)和max(hour)时,我确实找到了时间戳为22:18的记录。但我没有找到时间戳为16:40的记录,分钟为(分钟)和分钟(小时)。
select v.id,
h.fromdate,
h.hour,
h.department,
h.room
from visit v
inner join visit_hist h
on v.id = h.id
where v.id in ('10251183')
and h.room in ('B410','B420','C430','C440')
and h.fromdate =
(select min(fromdate)
from visit_hist
where (id= h.id
and h.hour =
(select min(hour) from visit_hist where id= h.id and h.date = date
))
)
order by v.date,
v.visit_id;
有人可以帮助我吗?
答案 0 :(得分:0)
只需使用窗口功能:
select . . .
from visit v inner join
(select vh.*, row_number() over (partition by vh.id order by date asc, hour asc) as seqnum
from visit_hist vh
where vh.room in ('B410', 'B420', 'C430', 'C440')
) vh
on v.id = vh.id
where v.id in (10251183) and seqnum = 1;
注意:这会为id
提供列表中的第一个房间。如果您想要第一个房间位于列表中的id
,请将vh.room
上的条件移至外部查询。