(T-SQL)基于where子句的sum datetime值间隔

时间:2017-07-31 10:06:30

标签: sql sql-server tsql datetime

需要帮助编写一个查询,该查询将根据另一列总结日期时间字段中的时间值。让我解释一下:

假设我有一个表 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

有人可以建议一个策略,或者说明它是如何完成的? 谢谢。

1 个答案:

答案 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()将是典型的方法。