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