Google bigquery BigQuery中值分析上方的持续时间

Google bigquery BigQuery中值分析上方的持续时间,google-bigquery,Google Bigquery,我在大查询中有一些时间序列数据,大约1百万行,每个样本每秒。我想看看如何确定一个值高于给定值的时间。就像天气/气候分析所说的“华氏100度以上连续30天”是一个新记录一样。我还想对所有值进行分析,例如,如果这是天气数据,连续几天的温度高于X,其中X是0到100之间的任何值 如果这是在电子表格中并使用代表性值: 最大数据时间功率220斜坡功能 2019-11-02 6:44:06 192 05 2019-11-02 6:44:07 2110 4 2019-11-02 6:44:08 226 1 5

我在大查询中有一些时间序列数据,大约1百万行,每个样本每秒。我想看看如何确定一个值高于给定值的时间。就像天气/气候分析所说的“华氏100度以上连续30天”是一个新记录一样。我还想对所有值进行分析,例如,如果这是天气数据,连续几天的温度高于X,其中X是0到100之间的任何值

如果这是在电子表格中并使用代表性值:

最大数据时间功率220斜坡功能

2019-11-02 6:44:06 192 05

2019-11-02 6:44:07 2110
4 2019-11-02 6:44:08 226 1 5 2019-11-02 6:44:09 248 12
6 2019-11-02 6:44:10221 13
7 2019-11-02 6:44:11 225 14
8 2019-11-02 6:44:12 233 15
9 2019-11-02 6:44:13 2110 0
10 2019-11-02 6:44:14 234 1
11 2019-11-02 6:44:15 238 12

在本例中,我将阈值设置为单元格D1中的220,然后我查看列C中的值是否大于等于220,如果是,我将列D的值设置为1。逻辑是

=如果(C2>=D$1,1,0)

对于D列,这将继续


然后,如果列D的下一行也是1,则列E也会递增。因此,当列C>=220时,列E会倾斜,如果下面的列C是用于BigQuery标准SQL,则会重置为0

#standardSQL
SELECT * EXCEPT(e), COUNTIF(d = 1) OVER(PARTITION BY e ORDER BY b) e
FROM (
  SELECT * EXCEPT(e), COUNTIF(e) OVER(ORDER BY b) e
  FROM (
    SELECT *, d != IFNULL(LAG(d) OVER(ORDER BY b), -1) e
    FROM (
      SELECT *, IF(c > 220, 1, 0) d
      FROM `project.dataset.table`
    )
  )
)
您可以使用问题中的样本数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table` AS (-- Data Time Power 220 Ramp function Max
  SELECT 2 a, TIMESTAMP '2019-11-02 06:44:06' b, 192 c UNION ALL
  SELECT 3, '2019-11-02 06:44:07', 211 UNION ALL
  SELECT 4, '2019-11-02 06:44:08', 226 UNION ALL
  SELECT 5, '2019-11-02 06:44:09', 248 UNION ALL
  SELECT 6, '2019-11-02 06:44:10', 221 UNION ALL
  SELECT 7, '2019-11-02 06:44:11', 225 UNION ALL
  SELECT 8, '2019-11-02 06:44:12', 233 UNION ALL
  SELECT 9, '2019-11-02 06:44:13', 211 UNION ALL
  SELECT 10, '2019-11-02 06:44:14', 234 UNION ALL
  SELECT 11, '2019-11-02 06:44:15', 238 
)
SELECT * EXCEPT(e), COUNTIF(d = 1) OVER(PARTITION BY e ORDER BY b) e
FROM (
  SELECT * EXCEPT(e), COUNTIF(e) OVER(ORDER BY b) e
  FROM (
    SELECT *, d != IFNULL(LAG(d) OVER(ORDER BY b), -1) e
    FROM (
      SELECT *, IF(c > 220, 1, 0) d
      FROM `project.dataset.table`
    )
  )
)
-- ORDER BY b   
有输出

Row a   b                       c   d   e    
1   2   2019-11-02 06:44:06 UTC 192 0   0    
2   3   2019-11-02 06:44:07 UTC 211 0   0    
3   4   2019-11-02 06:44:08 UTC 226 1   1    
4   5   2019-11-02 06:44:09 UTC 248 1   2    
5   6   2019-11-02 06:44:10 UTC 221 1   3    
6   7   2019-11-02 06:44:11 UTC 225 1   4    
7   8   2019-11-02 06:44:12 UTC 233 1   5    
8   9   2019-11-02 06:44:13 UTC 211 0   0    
9   10  2019-11-02 06:44:14 UTC 234 1   1    
10  11  2019-11-02 06:44:15 UTC 238 1   2    
更新以解决OP的以下评论

结果

Row Date        Time        Power   d   e    
1   2019-11-02  06:44:06    192     0   0    
2   2019-11-02  06:44:07    211     0   0    
3   2019-11-02  06:44:08    226     1   1    
4   2019-11-02  06:44:09    248     1   2    
5   2019-11-02  06:44:10    221     1   3    
6   2019-11-02  06:44:11    225     1   4    
7   2019-11-02  06:44:12    233     1   5    
8   2019-11-02  06:44:13    211     0   0    
9   2019-11-02  06:44:14    234     1   1    
10  2019-11-02  06:44:15    238     1   2    

注意:您可以使用
IF(Power>220,1,0)
表达式中的任何值

感谢您的SQL命令。它给了我一个错误,虽然“无法识别的名称c”您应该使用表中字段的名称-您尝试过吗?在我的示例中,我没有根据您在问题中使用的电子表格列对它们进行如此命名@史蒂文:你有机会试一下吗?你不认为它工作得很好。如果我将阈值设置为500,将结果另存为新表,然后查询该表,选择的数据如下:行日期时间幂d e 1 2019-06-06 05:18:20 146.0 0 2 2019-06-06 05:18:21 153.0 0 3请澄清,以便我可以再次检查-您使用的数据与我的回答中的数据相同,但将阈值从220更改为500,结果不是您预期的结果?
Row Date        Time        Power   d   e    
1   2019-11-02  06:44:06    192     0   0    
2   2019-11-02  06:44:07    211     0   0    
3   2019-11-02  06:44:08    226     1   1    
4   2019-11-02  06:44:09    248     1   2    
5   2019-11-02  06:44:10    221     1   3    
6   2019-11-02  06:44:11    225     1   4    
7   2019-11-02  06:44:12    233     1   5    
8   2019-11-02  06:44:13    211     0   0    
9   2019-11-02  06:44:14    234     1   1    
10  2019-11-02  06:44:15    238     1   2