根据差异总和的最大值访问所有行。在开始时间和结束时间列之间
Posted
技术标签:
【中文标题】根据差异总和的最大值访问所有行。在开始时间和结束时间列之间【英文标题】:Accessing all rows based on Max of Sum of Diff. between Start time and End time Columns 【发布时间】:2018-09-15 09:46:40 【问题描述】:我是 SQL 新手,所以在尝试了很多之后,我在 *** 上找不到合适的解决方案。这就是我发布问题的原因。[可能是重复的问题] 我有 2 张桌子 Driver 和 Ride。结构如下:
表格:
Person:
id Name Email reg_number
37 test1 test1@gmail.com 111111
38 test2 test2@gmail.com 222222
39 test3 test3@gmail.com 333333
40 test4 test4@gmail.com 444444
41 test5 test5@gmail.com 555555
42 test6 test6@gmail.com 666666
Rides:
id Person_id start_time end_time distance
23 38 2018-08-08T12:12:12 2018-08-08T13:12:12 1000
24 39 2018-08-08T12:12:12 2018-08-08T14:12:12 1100
25 40 2018-08-08T12:12:12 2018-08-08T13:12:12 1200
26 41 2018-08-08T12:12:12 2018-08-08T15:12:12 1300
27 42 2018-08-08T12:12:12 2018-08-08T15:12:12 600
28 42 2018-08-08T12:12:12 2018-08-08T13:12:12 700
29 41 2018-08-08T12:12:12 2018-08-08T16:12:12 800
我的查询是:此人是乘坐出租车的司机。
start_time 是他骑行的开始时间。 end_time 是他骑行的结束时间。距离是以公里为单位的距离。
我想将开始和结束时间传递给查询。
结果应包括 TOP 5 人及其电子邮件、姓名、总骑行分钟数、最长骑行时间(以分钟为单位)。
仅应计算在上述持续时间内开始和结束的游乐设施。
注意:一个人所有骑行的总分钟数是 TOP 的标准。
【问题讨论】:
你在用什么rdbms? @android 。 . .用您正在使用的数据库标记您的问题。 【参考方案1】:众所周知,日期/时间函数依赖于数据库。您需要标记您正在使用的数据库。
我假设您使用的是 mysql。
您只需使用rides
表即可回答“前 5 名”:
select r.person_id,
sum(to_seconds(r.end_time) - to_seconds(r.start_time)) as duration_seconds
from rides r
where r.start_time >= ? and
r.end_time <= ?
group by r.person_id
order by duration_seconds desc
limit 5;
这基本上就是你想要的。现在您只需添加person
信息并将秒转换为分钟:
select p.*, top5.duration_seconds / 60 as duration_minutes
from (select r.person_id,
sum(to_seconds(r.end_time) - to_seconds(r.start_time)) as duration_seconds
from rides r
where r.start_time >= ? and
r.end_time <= ?
group by r.person_id
order by duration_seconds desc
limit 5
) top5 join
person p
on top5.person_id = p.id;
其他数据库有其他方法来提取两个 datetime
值之间的持续时间。
?
是定义时间范围的值的占位符。
【讨论】:
谢谢。如何包含查询以获取特定人的所有游乐设施的最长持续时间? @Android 。 . .您可以使用max()
代替或补充 sum()
。
@Gordon Linoff:嗨,我将整个查询字符串传递给 Spring 中的 @Query() 注释。它导致许多无效的令牌异常。
例如引起:org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:(靠近第 1 行,第 101 列
例如:antlr.NoViableAltException:意外令牌:总和以上是关于根据差异总和的最大值访问所有行。在开始时间和结束时间列之间的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 给定二叉树,找到最大路径总和。路径可以在树中的任何节点处开始和结束。
如何计算行值相对于其他行值的差异总和,特别是使用窗口函数不包括该行