SQL子查询:如何使用min(date)和min(hour)来记录记录

时间:2017-11-13 14:34:38

标签: sql minimum correlated-subquery

我有一张桌子,我想从中找到第一条记录,其中包含一段IN(' B410',' B420',' C430',& #39; C440&#39)。因此,我认为这意味着要查找具有最早日期的记录,并在最旧的日期内查找具有最早时间戳的记录。

table

我用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;

有人可以帮助我吗?

1 个答案:

答案 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上的条件移至外部查询。