我有一个带各种信号和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。
您能帮我还是给我一些小费?
最好的问候, 斯科蒂
答案 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
注意
上面的查询是用MSSQL编写的,以进行演示。 bigquery唯一需要的更改是更改:
DATEDIFF(SECOND, MIN(timestamp), MAX(timestamp))
到
DATETIME_DIFF(MAX(timestamp), MIN(timestamp), SECOND)
或可能
TIMESTAMP_DIFF(MAX(timestamp), MIN(timestamp), SECOND)
取决于您的列数据类型。