如何在bigquery中获得活动信号的持续时间?

时间:2020-06-29 10:04:20

标签: datetime google-bigquery duration

我有一个带各种信号和utc时间戳的bigquery表。我想获得“ Sensor”列的值大于1的营业时间作为查询结果。

我的想法是以某种方式获取传感器> 1的时间戳的最小值和最大值,并从最大值(时间戳)中减去最小值(时间戳)并将其汇总为传感器> 1的新列,作为工作时间。

timestamp,Sensor
2020-05-13 08:46:29 UTC,0.76306754
2020-05-13 08:46:28 UTC,0.76306754
2020-05-13 08:46:27 UTC,0.76306754
2020-05-13 08:46:26 UTC,0.76306754
2020-05-13 08:46:25 UTC,0.76306754
2020-05-13 08:46:24 UTC,0.76306754
2020-05-13 08:46:23 UTC,0.76306754
2020-05-13 08:46:22 UTC,1.4879817
2020-05-13 08:46:21 UTC,1.4879817
2020-05-13 08:46:20 UTC,1.4879817
2020-05-13 08:45:58 UTC,0.6486074
2020-05-13 08:45:57 UTC,0.6486074
2020-05-13 08:45:56 UTC,0.6486074
2020-05-13 08:45:55 UTC,0.6486074
2020-05-13 08:45:54 UTC,0.6486074
2020-05-13 08:45:53 UTC,0.6486074
2020-05-13 08:45:52 UTC,0.6486074
2020-05-13 08:45:51 UTC,0.6486074
2020-05-13 08:45:50 UTC,0.6486074
2020-05-13 08:45:49 UTC,0.6486074
2020-05-13 08:45:48 UTC,0.6486074
2020-05-13 08:45:47 UTC,0.6486074
2020-05-13 08:45:46 UTC,0.6486074
2020-05-13 08:45:45 UTC,0.6486074
2020-05-13 08:45:44 UTC,0.6486074
2020-05-13 08:45:43 UTC,0.6486074
2020-05-13 08:45:42 UTC,0.6486074
2020-05-13 08:45:41 UTC,0.6486074
2020-05-13 08:45:40 UTC,0.6486074
2020-05-13 08:45:39 UTC,0.6486074
2020-05-13 08:45:38 UTC,1.2972147
2020-05-13 08:45:37 UTC,1.2972147
2020-05-13 08:45:36 UTC,1.2972147
2020-05-13 08:45:35 UTC,1.2972147
2020-05-13 08:45:34 UTC,1.2972147
2020-05-13 08:45:33 UTC,1.2972147
2020-05-13 08:45:15 UTC,0.76306754
2020-05-13 08:45:14 UTC,0.76306754
2020-05-13 08:45:13 UTC,0.76306754
2020-05-13 08:45:12 UTC,0.76306754
2020-05-13 08:45:11 UTC,0.76306754
2020-05-13 08:45:10 UTC,0.76306754
2020-05-13 08:45:09 UTC,0.76306754
2020-05-13 08:45:08 UTC,0.76306754
2020-05-13 08:45:07 UTC,0.76306754
2020-05-13 08:45:06 UTC,0.76306754
2020-05-13 08:45:05 UTC,0.76306754
2020-05-13 08:45:04 UTC,1.4879817
2020-05-13 08:45:03 UTC,1.4879817
2020-05-13 08:45:02 UTC,1.4879817
2020-05-13 08:45:01 UTC,1.4879817
2020-05-13 08:44:42 UTC,0.5723007
2020-05-13 08:44:41 UTC,0.5723007
2020-05-13 08:44:40 UTC,0.5723007
2020-05-13 08:44:39 UTC,0.5723007
2020-05-13 08:44:38 UTC,0.5723007
2020-05-13 08:44:37 UTC,0.5723007
2020-05-13 08:44:36 UTC,0.5723007
2020-05-13 08:44:35 UTC,0.5723007
2020-05-13 08:44:34 UTC,0.5723007
2020-05-13 08:44:33 UTC,0.5723007
2020-05-13 08:44:32 UTC,1.5642884
2020-05-13 08:44:31 UTC,1.5642884
2020-05-13 08:44:30 UTC,1.5642884
2020-05-13 08:44:19 UTC,0.5723007
2020-05-13 08:44:18 UTC,0.5723007
2020-05-13 08:44:17 UTC,0.5723007
2020-05-13 08:44:16 UTC,0.5723007
2020-05-13 08:44:15 UTC,0.5723007
2020-05-13 08:44:14 UTC,0.5723007
2020-05-13 08:44:13 UTC,0.5723007
2020-05-13 08:44:12 UTC,0.5723007
2020-05-13 08:44:11 UTC,0.5723007
2020-05-13 08:44:10 UTC,1.4879817
2020-05-13 08:44:09 UTC,1.4879817
2020-05-13 08:44:08 UTC,1.4879817
2020-05-13 08:43:53 UTC,0.5723007
2020-05-13 08:43:52 UTC,0.5723007
2020-05-13 08:43:51 UTC,0.5723007
2020-05-13 08:43:50 UTC,0.5723007
2020-05-13 08:43:49 UTC,0.5723007
2020-05-13 08:43:48 UTC,0.5723007
2020-05-13 08:43:47 UTC,0.5723007
2020-05-13 08:43:46 UTC,0.5723007
2020-05-13 08:43:45 UTC,0.5723007
2020-05-13 08:43:44 UTC,1.5642884
2020-05-13 08:43:43 UTC,1.5642884
2020-05-13 08:43:42 UTC,1.5642884
2020-05-13 08:43:25 UTC,1.4879817
2020-05-13 08:43:24 UTC,1.4879817
2020-05-13 08:43:08 UTC,1.2590615
2020-05-13 08:43:07 UTC,1.2590615
2020-05-13 08:43:06 UTC,1.2590615
2020-05-13 08:42:50 UTC,1.2590615
2020-05-13 08:42:49 UTC,1.2590615
2020-05-13 08:42:48 UTC,1.2590615
2020-05-13 08:42:47 UTC,1.2590615
2020-05-13 08:42:34 UTC,0.53414726
2020-05-13 08:42:33 UTC,0.53414726
2020-05-13 08:42:32 UTC,0.53414726

不幸的是,我没有找到有关如何获取Sensor大于1的时间戳的min(time)和max(time)的任何信息,以及如何将时间戳加重到工作时间(持续时间)。我想我需要以任何方式使用minif和maxif。

您能帮我还是给我一些小费?

最好的问候, 斯科蒂

2 个答案:

答案 0 :(得分:0)

我能够编写查询来实现您的目标。为此,我使用了MAX()MIN()内置函数来获取特定传感器的时间戳的最大值和最小值。这两个函数均可与ARRAY STRUCT以外的任何数据类型一起使用。除此之外,TIMESTAMP_DIFF()还用于检索两个时间戳之间的差异。

我必须指出,我已将您在问题中提供的数据上传到一个表中,以便可以复制该案例。下面是对StandardSQL的查询:

SELECT Sensor, MAX(timestamp) AS max_ts , 
MIN(timestamp) AS min_ts, 
TIMESTAMP_DIFF(MAX(timestamp), MIN(timestamp), SECOND) AS duration_ 
FROM `project_id.dataset.table` 
WHERE Sensor > 1
GROUP BY Sensor

输出,

Row Sensor    max_ts                  min_ts                  duration_seconds
1   1.2972147 2020-05-13 08:45:38 UTC 2020-05-13 08:45:33 UTC 5
2   1.4879817 2020-05-13 08:46:22 UTC 2020-05-13 08:43:24 UTC 178
3   1.2590615 2020-05-13 08:43:08 UTC 2020-05-13 08:42:47 UTC 21
4   1.5642884 2020-05-13 08:44:32 UTC 2020-05-13 08:43:42 UTC 50

请注意,必须在TIMESTAMP_DIFF()中指定 日期部分 ,在这种情况下,我选择了SECONDS。虽然,还有其他可用的日期部分here

答案 1 :(得分:0)

这是一个“间隙和孤岛”解决方案,该解决方案使用一系列CTE对传感器值> = 1的每组行的最小时间戳和最大时间戳之间的时间求和。第一个CTE生成标志以指示“正在操作”(传感器> = 1)和整个数据集以及依赖于“正在运行”的数据上的行号。在第二个CTE中,将行号相减以形成一组值(传感器> = 1或<1)。此CTE筛选出传感器值<1的组。在第三个CTE中,计算出每个组的最小时间戳和最大时间戳之间的差异(以秒为单位),在最终查询中将这些差异求和以得出总计工作时间。

WITH CTE AS (
  SELECT timestamp,
         CASE WHEN Sensor >= 1 THEN 1 ELSE 0 END AS Operating,
         ROW_NUMBER() OVER (ORDER BY timestamp DESC) rn,
         ROW_NUMBER() OVER (PARTITION BY CASE WHEN Sensor >= 1 THEN 1 ELSE 0 END ORDER BY timestamp DESC) rn1
  FROM data
),
CTE2 AS (
  SELECT timestamp, 
         Operating,
         rn - rn1 AS grp
  FROM CTE
  WHERE Operating = 1
),
CTE3 AS (
  SELECT DATEDIFF(SECOND, MIN(timestamp), MAX(timestamp)) AS OpTime
  FROM CTE2
  GROUP BY grp
)
SELECT SUM(OpTime) AS OperatingTime
FROM CTE3

输出(用于您的示例数据):

OperatingTime
71

Demo on SQLFiddle

注意

上面的查询是用MSSQL编写的,以进行演示。 bigquery唯一需要的更改是更改:

DATEDIFF(SECOND, MIN(timestamp), MAX(timestamp))

DATETIME_DIFF(MAX(timestamp), MIN(timestamp), SECOND)

或可能

TIMESTAMP_DIFF(MAX(timestamp), MIN(timestamp), SECOND)

取决于您的列数据类型。

相关问题