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;
注意:这会给出列表中第一个房间的id
s。如果您想要第一个房间在列表中的id
s,则将vh.room
上的条件移至外部查询。
【讨论】:
@ Gordon,我将结果过滤到只有一个 visit_id,但我想在数千个 visit_id 上运行该查询。这对您建议的解决方案有何影响? @Bertusian 。 . .即使您删除v.id
上的过滤器,代码也应该可以工作。以上是关于SQL 子查询:如何用 min(date) 和 min(hour) 绘制记录的主要内容,如果未能解决你的问题,请参考以下文章
sql语句中如何用 EXISTS 引入子查询?没有exists引入子查询时怎样实现子查询?
oracle db 如何用一条sql查询2个时间之间的工作时间间隔