根据差异总和的最大值访问所有行。在开始时间和结束时间列之间

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 给定二叉树,找到最大路径总和。路径可以在树中的任何节点处开始和结束。

除自定义工作日外的所有记录的总和日期差异

如何计算行值相对于其他行值的差异总和,特别是使用窗口函数不包括该行

python pandas:groupby中2个日期之间的差异

将数字分组 C++

如何在 python 列表中找到所有行的开始和结束索引