Я хочу вывести МАКС (значение) в течение следующих 30 минут, ЕСЛИ текущее значение строки> 10, а предыдущая строка <10 - PullRequest
1 голос
/ 27 марта 2020

Использование данных mytable

date value 2019-07-11 02:20:00 UTC 14.99 2019-07-11 02:30:00 UTC 12.53 2019-07-11 02:40:00 UTC 12.53 2019-07-11 02:50:00 UTC 14.99 2019-07-11 03:00:00 UTC 10.07 2019-07-11 03:10:00 UTC 7.61 2019-07-11 03:20:00 UTC 7.61 2019-07-11 03:30:00 UTC 10.07 2019-07-11 03:40:00 UTC 10.07 2019-07-11 03:50:00 UTC 7.61 2019-07-11 04:00:00 UTC 7.61 2019-07-11 04:10:00 UTC 7.61:

Я хочу вывести МАКС (значение) в течение следующих 30 минут, ЕСЛИ текущее значение строки> 10, а предыдущая строка <10. </p>

Например, если значение> 10, проверьте значение предыдущей строки <10. Если это так, выведите MAX (значение) через 30 минут после текущей строки. Для приведенной выше таблицы первое значение, которое будет выводиться, должно быть 10,07 </p>.

1 Ответ

0 голосов
/ 27 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  CASE value > 10 AND prev_value < 10
    WHEN TRUE THEN 
      MAX(value) OVER(ORDER BY UNIX_SECONDS(ts) RANGE BETWEEN CURRENT ROW AND 1800 FOLLOWING)
    ELSE NULL
  END max_value_next_30_min
FROM (
  SELECT *, LAG(value) OVER(ORDER BY ts) prev_value
  FROM `project.dataset.table`
)
-- ORDER BY ts  

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT TIMESTAMP '2019-07-11 02:20:00 UTC' ts, 14.99 value UNION ALL
  SELECT '2019-07-11 02:30:00 UTC', 12.53 UNION ALL
  SELECT '2019-07-11 02:40:00 UTC', 12.53 UNION ALL
  SELECT '2019-07-11 02:50:00 UTC', 14.99 UNION ALL
  SELECT '2019-07-11 03:00:00 UTC', 10.07 UNION ALL
  SELECT '2019-07-11 03:10:00 UTC', 7.61 UNION ALL
  SELECT '2019-07-11 03:20:00 UTC', 7.61 UNION ALL
  SELECT '2019-07-11 03:30:00 UTC', 10.07 UNION ALL
  SELECT '2019-07-11 03:40:00 UTC', 10.07 UNION ALL
  SELECT '2019-07-11 03:50:00 UTC', 17.61 UNION ALL
  SELECT '2019-07-11 04:00:00 UTC', 7.61 UNION ALL 
  SELECT '2019-07-11 04:10:00 UTC', 7.61
)
SELECT *, 
  CASE value > 10 AND prev_value < 10
    WHEN TRUE THEN 
      MAX(value) OVER(ORDER BY UNIX_SECONDS(ts) RANGE BETWEEN CURRENT ROW AND 1800 FOLLOWING)
    ELSE NULL
  END max_value_next_30_min
FROM (
  SELECT *, LAG(value) OVER(ORDER BY ts) prev_value
  FROM `project.dataset.table`
)
-- ORDER BY ts   

с выводом

Row ts                      value   prev_value  max_value_next_30_min    
1   2019-07-11 02:20:00 UTC 14.99   null        null     
2   2019-07-11 02:30:00 UTC 12.53   14.99       null     
3   2019-07-11 02:40:00 UTC 12.53   12.53       null     
4   2019-07-11 02:50:00 UTC 14.99   12.53       null     
5   2019-07-11 03:00:00 UTC 10.07   14.99       null     
6   2019-07-11 03:10:00 UTC 7.61    10.07       null     
7   2019-07-11 03:20:00 UTC 7.61    7.61        null     
8   2019-07-11 03:30:00 UTC 10.07   7.61        17.61    
9   2019-07-11 03:40:00 UTC 10.07   10.07       null     
10  2019-07-11 03:50:00 UTC 17.61   10.07       null     
11  2019-07-11 04:00:00 UTC 7.61    17.61       null     
12  2019-07-11 04:10:00 UTC 7.61    7.61        null     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...