SQL 子查询:如何同时抓取包含 min(date) 和 min(hour) 的记录

SQL subquery: How to grap the record with both the min(date) and min(hour)

我有一个 table,我想从中获取第一个给出段落 IN ('B410','B420','C430','C440').所以,我想这意味着要查找最旧日期的记录,并在该最旧日期内查找具有最旧时间戳的记录。

我写了一个包含 2 个嵌套子查询的查询,但该查询不起作用(它给了我一个空结果)。我究竟做错了什么?奇怪的是,当更改语法以查找 max(fromdate) 和 max(hour) 时,我确实找到了带有 timstamp 22:18 的记录。但是我没有找到时间戳为 16:40 的记录,其中包含 min(fromdate) 和 min(hour)。

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;

有人可以帮我吗?

只需使用window函数:

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;

注意:这给出了列表中第一个房间的 ids。如果您想要第一个房间在列表中的 id,则将 vh.room 上的条件移动到外部查询。