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

Posted

技术标签:

【中文标题】SQL 子查询:如何用 min(date) 和 min(hour) 绘制记录【英文标题】:SQL subquery: How to grap the record with both the min(date) and min(hour) 【发布时间】:2018-04-26 06:44:07 【问题描述】:

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

我编写了一个带有 2 个嵌套子查询的查询,但该查询并不能解决问题(它给了我一个空结果)。我究竟做错了什么?奇怪的是,当更改语法以查找 max(fromdate) 和 max(hour) 时,我确实找到了 timstamp 22:18 的记录。但我没有找到带有 min(fromdate) 和 min(hour) 的时间戳 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;

有人可以帮我吗?

【问题讨论】:

您使用的是哪个数据库? SQL Server(通过查看屏幕截图)? 从管理工作室的截图看起来像 SQLS @bertusian 所以你的日期和时间存储在不同的列中? (我永远不会明白为什么人们会这样做..)。请发布您在右键单击表格并选择设计时看到的屏幕截图。或者,右键单击表格,选择 SCRIPT AS>>CREATE TABLE to NEW QUERY WINDOW 并发布该文本 是的,我使用 SQL Server Management Studio。日期和时间确实存储在不同的列中。 @Caius Jard,我是否可能没有执行该命令的权限。右键单击表格时看不到它。 【参考方案1】:

只使用窗口函数:

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。如果您想要第一个房间在列表中的ids,则将vh.room 上的条件移至外部查询。

【讨论】:

@ Gordon,我将结果过滤到只有一个 visit_id,但我想在数千个 visit_id 上运行该查询。这对您建议的解决方案有何影响? @Bertusian 。 . .即使您删除 v.id 上的过滤器,代码也应该可以工作。

以上是关于SQL 子查询:如何用 min(date) 和 min(hour) 绘制记录的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中如何用 EXISTS 引入子查询?没有exists引入子查询时怎样实现子查询?

如何用sql查询出连续三个月金额大于50的记录

oracle db 如何用一条sql查询2个时间之间的工作时间间隔

如何用SQL语句的查询实现两个表之间的查询连接

MySQL里的Date型和Time型两个字段,如何用PYTHON合并为一个Datetime字段

在PL/SQL中如何用SQL语句查询数据库中所有表的数据数量?