SQL动态运行总计

SQL动态运行总计,sql,sql-server,tsql,window-functions,Sql,Sql Server,Tsql,Window Functions,我希望有人能帮我查询,我需要建立一个上下运行的总数,这是数据集的粗略概念 poolname date status test1 2018-11-01 08:39:09.737 started test1 2018-11-01 08:40:09.737 started test1 2018-11-01 08:41:09.737 finished test1 2018-11-01 08:42:09.737 starte

我希望有人能帮我查询,我需要建立一个上下运行的总数,这是数据集的粗略概念

poolname date status test1 2018-11-01 08:39:09.737 started test1 2018-11-01 08:40:09.737 started test1 2018-11-01 08:41:09.737 finished test1 2018-11-01 08:42:09.737 started test1 2018-11-01 08:44:09.737 finished test1 2018-11-01 08:45:09.737 finished test2 2018-11-01 08:21:09.737 started test2 2018-11-01 08:22:09.737 started test2 2018-11-01 08:24:09.737 finished test2 2018-11-01 08:30:09.737 finished 池名日期状态 测试1 2018-11-01 08:39:09.737开始 测试1 2018-11-01 08:40:09.737开始 测试1 2018-11-01 08:41:09.737完成 测试1 2018-11-01 08:42:09.737开始 测试1 2018-11-01 08:44:09.737完成 测试1 2018-11-01 08:45:09.737完成 测试2 2018-11-01 08:21:09.737开始 测试2 2018-11-01 08:22:09.737开始 测试2 2018-11-01 08:24:09.737完成 测试2 2018-11-01 08:30:09.737完成 这是我需要的输出:

poolname date status RunningTotal test1 2018-11-01 08:39:09.737 started 1 test1 2018-11-01 08:40:09.737 started 2 test1 2018-11-01 08:41:09.737 finished 1 test1 2018-11-01 08:42:09.737 started 2 test1 2018-11-01 08:44:09.737 finished 1 test1 2018-11-01 08:45:09.737 finished 0 test2 2018-11-01 08:21:09.737 started 1 test2 2018-11-01 08:22:09.737 started 2 test2 2018-11-01 08:24:09.737 finished 1 test2 2018-11-01 08:30:09.737 finished 0 poolname日期状态RunningTotal 测试2018-11-01 08:39:09.737开始1 测试2018-11-01 08:40:09.737开始2 测试2018-11-01 08:41:09.737完成1 测试2018-11-01 08:42:09.737开始2 测试2018-11-01 08:44:09.737完成1 测试1 2018-11-01 08:45:09.737完成0 测试2 2018-11-01 08:21:09.737开始1 测试2 2018-11-01 08:22:09.737开始2 测试2 2018-11-01 08:24:09.737完成1 测试2 2018-11-01 08:30:09.737完成0
我希望这是有意义的,我需要尽可能保持它的效率,我一直在尝试使用窗口函数,超前和滞后。我确信有一个非常简单的方法可以做到这一点,但我还没有弄明白。

你想要一个累积的总和:

select t.*,
       sum(case when status = 'start' then 1
                when status = 'finished' then -1
                else 0
           end) over (partition by poolid order by date) as as runningTotal
from t;

不要张贴文本图像;是文本。将(表格格式)文本发布为
文本
。至少我们可以使用它,“我一直在尝试使用窗口函数,超前和滞后”,这些尝试是什么?为什么它们不起作用?当我发布文本时,它没有以我想要的表格格式出现,看起来很难看,所以我添加了图像。从我的个人资料可以看出,我不经常使用stackoverflow,所以我不熟悉格式化方面的最佳实践。我尝试在CASE语句中对started和finished进行SUM(日期)(按PoolName划分,按日期排序,在无界的前一行和当前行之间的ASC行)。我已经删除了我的超前和滞后尝试。你的问题,不要把你的尝试放在评论中。至于桌子,看一看,我为你固定了第一张图片。请使用编辑链接并查看我是如何修复第二张图像的。我相信您键入了一点-SUM需要一个OVER子句来作为累积(例如,
SUM(…)OVER(按池名、日期排序)作为runningTotal
谢谢,它并没有完全解决这个问题,但它给了我一个想法,将它添加到我的窗口函数中,它似乎正在工作!谢谢:)我添加了(按池名划分顺序按日期在无界的前一行和当前行之间ASC行)@Yen。不需要使用之间的
行。@Yen如果查看文档,您会发现between具有默认值“介于无界的前一行和当前行之间的范围”,因此,如果数据中没有相同的时间戳,则order by就足够了。