Python 获取增量更改的逻辑

Python 获取增量更改的逻辑,python,pyspark,logic,azure-cosmosdb,Python,Pyspark,Logic,Azure Cosmosdb,我在不同的组织中使用了一项资产 我试图得到一个组织在给定的一天中如何使用工时资源 将小时视为车辆行驶的总公里数。它将保持增量 我有一份工作,每小时都会在组织中获得数小时的资产 具有相同组织的SampleData快照资产: 在这种情况下,资产只在一个组织中使用,因此很容易获得一天的小时数 MaxHours(8) - MinHours(2) = 6 hours a day 但是,如果资产在同一天在多个组织中使用。我将有如下数据 这里,我按时间顺序分类 具有多个组织的SampleData快照资产

我在不同的组织中使用了一项资产

我试图得到一个组织在给定的一天中如何使用工时资源

将小时视为车辆行驶的总公里数。它将保持增量

我有一份工作,每小时都会在组织中获得数小时的资产

具有相同组织的SampleData快照资产:

在这种情况下,资产只在一个组织中使用,因此很容易获得一天的小时数

MaxHours(8) - MinHours(2) = 6 hours a day
但是,如果资产在同一天在多个组织中使用。我将有如下数据

这里,我按时间顺序分类

具有多个组织的SampleData快照资产

如果我按资产和组织分组,得到最小值和最大值。将有如下数据

按组织和资产分组

但是现在我不能做最大和最小

例如:组织1

MaxHour(22) - MinHours(10) = 12 hours a day
这是错误的

起初,组织1使用资产“A”4个小时,资产移动到组织2。 当天晚些时候,资产又回到了组织1,持续了2个小时

所以总共应该是6个小时

基于第二个快照,它应该是

14 - 10 = 4

22 - 20 = 2

Total: 6 hours
我无法找到资产何时移动到不同的组织。 并且没有逻辑来执行上述计算

注意,我不能使用for循环,因为我一天有超过900k条记录/行

MaxHours(8) - MinHours(2) = 6 hours a day

我正在连接到CosmosDB的Databrick(Python Spark)中执行此操作。

组织2和组织3的预期增量变化是什么?如果两者都是4,那么您只需要在一个窗口函数上计算滞后('Hours'),然后groupby并求和。谢谢jxc,但是第一行的问题是如果我做滞后('Hours'),那么滞后列的第一个记录将为零。第一个delta_hour为空,我认为这是预期的。如果您需要Org2=2和Org3=4的最终结果,那么您可能需要另一个窗口来设置组中的第一个窗口,其中多行Org2+Asset组合以连续小时显示,其中delta_hour=0。否则,
deala\u hours=hours-prev\u hours
Org 2和Org 3必须为4。我正在尝试添加另一个窗口。谢谢你,jxc。如果Org-2和Org-3都是4,你可能只需要一个窗口,例如:df.withColumn('delta_-hours',F.col('hours')-F.lag('hours')。over(Window.partitionBy('Asset')。orderBy('hours'))。groupby('Org','Asset')。agg(F.sum('delta_-hours'))组织2和组织3的预期delta变化是什么?如果两者都是4,那么您只需要在一个窗口函数上计算滞后('Hours'),然后groupby并求和。谢谢jxc,但是第一行的问题是如果我做滞后('Hours'),那么滞后列的第一个记录将为零。第一个delta_hour为空,我认为这是预期的。如果您需要Org2=2和Org3=4的最终结果,那么您可能需要另一个窗口来设置组中的第一个窗口,其中多行Org2+Asset组合以连续小时显示,其中delta_hour=0。否则,
deala\u hours=hours-prev\u hours
Org 2和Org 3必须为4。我正在尝试添加另一个窗口。谢谢jxc。如果Org-2和Org-3都是4,您可能只需要一个窗口,例如:df.withColumn('delta_-hours',F.col('hours')-F.lag('hours')。over(Window.partitionBy('Asset')。orderBy('hours'))。groupby('Org','Asset')。agg(F.sum('delta_-hours'))