需要帮助编写一个查询,该查询将根据另一列总结日期时间字段中的时间值。让我解释一下:
假设我有一个表 Table1 ,其中有两个字段:DATETIME类型的 timeStamp 和播放器 VARCHAR。假设我在玩家拿到球的时候输入了一个时间戳,经过一段时间后,玩家B得到了球并输入了他的时间,所以最终我会得到这样的东西:
+-------------------------+---------+
| TimeLapse | Player |
+-------------------------+---------+
| 2017-07-03 10:37:14.740 | playerA |
| 2017-07-03 11:49:14.787 | playerB |
| 2017-07-03 11:53:59.157 | playerA |
| 2017-07-03 12:58:30.313 | playerA |
| 2017-07-03 12:58:34.000 | playerB |
| 2017-07-03 13:58:43.327 | playerA |
| 2017-07-04 19:48:39.817 | playerA |
| 2017-07-05 11:54:53.657 | playerA |
+-------------------------+---------+
我最终想要的是计算球员A拿球时的时间(比如几分钟)(只有他拿球时)。 我有点卡住了。我没有遇到任何问题,所有的时间球员都拿球,但是我不知何故需要减去球员B拿球的时间。 所以我需要总结一下:
time from
| 2017-07-03 10:37:14.740 | playerA |
to
| 2017-07-03 11:49:14.787 | playerB |
then from
| 2017-07-03 11:53:59.157 | playerA |
to
| 2017-07-03 12:58:30.313 | playerA |
and to
| 2017-07-03 12:58:34.000 | playerB |
...
and so on
有人可以建议一个策略,或者说明它是如何完成的? 谢谢。
答案 0 :(得分:2)
您可以使用行号方法的差异来识别组。然后,您可以使用聚合和lead()
来获取开始和结束时间,如下所示:
select player, min(timelapse) as start_timelapse,
lead(max(timelapse)) over (order by max(timelapse)
) as next_timelapse
from (select t1.*,
row_number() over (order by timelapse) as seqnum_t,
row_number() over (partition by player order by timelapse) as seqnum_tp
from table1 t1
) t1
group by (seqnum_t - seqnum_tp), player;
这是如何工作的有点棘手。运行子查询以确定两个行号的区别为什么标识所需的组。
对于时差,您要使用返回的两列。目前还不清楚你想要哪些单位,但datediff()
将是典型的方法。