我有张桌子看起来像这样:
忍受我吧,这会让我有点困惑;
我希望得到所需列中的值。计算是:StartTime-(上一行)结束时。所以第2行(开始时间)减去第1行结束时间是17:04:48 - 17:04:31 (=17秒)。但是,在进行日期减去计算之前,我希望排除CustAgentFl =0和Transfer频标= 0的行。另外,如果Starttime是<0,那么只有0。
行都按相同的NID分组,因此DAX查询当然需要按NID分组。
发布于 2018-11-05 00:33:15
如果可以使用数据库为您计算这些值,则可以使用迟滞窗口函数从上一行中获取值。但是,在数据库中没有明显的前一行,因为行的排序是未定义的。因此,要获得上一行的值,必须定义顺序。这就是过关子句中ORDER的目的。我假设您的订单是StartTime的。在这种情况下,您可以使用如下代码:
declare @Table table(NID int, DgAcs char(1), CustAgentFl int, AgentId int, StartTime datetime, EndTime datetime, TransferFlag int, Desired int)
insert into @Table values
(4565, 'C', 1, 358746, '2018-09-08 17:02:37', '2018-09-08 17:04:31', 1, 0),
(4565, 'C', 1, 358714, '2018-09-08 17:04:48', '2018-09-08 17:08:17', 1, 17),
(4565, 'C', 1, 359548, '2018-09-08 17:07:07', '2018-09-08 17:13:41', 1, 0),
(4565, 'C', 1, 358749, '2018-09-08 17:13:54', '2018-09-08 17:21:09', 1, 13),
(4565, 'A', 1, 351897, '2018-09-08 17:19:09', '2018-09-08 17:20:36', 0, 0),
(4565, 'C', 1, 358896, '2018-09-08 17:21:08', '2018-09-08 17:26:00', 0, 0)
; with cte as (
select
*
, LAG(EndTime, 1) over(order by StartTime) as PrevEndTime
, DATEDIFF(s, LAG(EndTime, 1) over(order by StartTime), StartTime) as SecondsSinceLastEndNullable
, ISNULL(DATEDIFF(s, LAG(EndTime, 1) over(order by StartTime), StartTime), 0) as SecondsSinceLastEnd
from @Table
)
select
*
, iif(SecondsSinceLastEnd <= 0, '00:00:00', concat(SecondsSinceLastEnd / 3600, ':', FORMAT((SecondsSinceLastEnd / 60) % 60, 'D2'), ':', FORMAT(SecondsSinceLastEnd % 60, 'D2')))
, iif(SecondsSinceLastEnd <= 0, '00:00:00', CONVERT(varchar, DATEADD(s, SecondsSinceLastEnd, 0), 108))
from cte
您将所需的输出格式化为时间,但请注意,时间中的两个时刻之间的差异并不完全是时间。可能要超过24小时。我向您展示了以所需格式转换秒差数的两种方法。第二种方法使用转换来获得时间值,但正如我所说的,这不会对超过24小时的间隙起作用。第一种方法将给出H:MM:SS格式的持续时间,其中H是小时数,可能大于23小时。
在Power中,您可以将其写为自定义查询。
https://stackoverflow.com/questions/53146495
复制相似问题