如何计算大于或等于上一个值的值



我有一个数据集,放在图表中时会产生正弦波。让我们想象一下,每天上午9点左右,我的图表都会达到一天中的最低点,并开始上升。下午6点左右达到最高点。我需要计算(从上午9点到下午6点,当我的价值增加时(我的价值比上一个值大或等于多少倍,我的价值比前一个值小多少倍。

让我们取11个值:[4-4-5-6-5-6-5-6-7-7-8]。我有8个值大于或等于前一个值。只比上一次少了2个。这个想法是可以说,在这段时间里,我有8个正值,级数为4(从4到8(。这意味着平均来说,一个正值给我0.5。

重要提示:我正在使用BigQuery

到目前为止,我的问题是:

select created_at,id,value,
(SELECT Count(value) from `dataset` where id LIKE "A1" AND value >= ?previous?) as positive,
(SELECT Count(value) from `dataset` where id LIKE "A1" AND value < ?previous?) as negative
from `dataset` 
where id LIKE "A1" 
AND value != 0 
AND DATETIME(created_at) BETWEEN PARSE_DATETIME("%Y%m%d:%H:%M:%S", "20210505:09:00:00") AND PARSE_DATETIME("%Y%m%d:%H:%M:%S", "20210505:17:59:59") 
order by created_at desc

这是一个数据示例。Id不是指行,而是指数据的源。

id | created_at |值

A1|2021-05-05 09:00:01|20

A1|2021-05-05 09:30:12|26

A1|2021-05-05 10:00:44|28

A1|2021-05-05 10:30:44|33

A1|2021-05-05 11:00:44|32

A1|2021-05-05 11:30:44|38

A1|2021-05-05 12:00:44|44

A1|2021-05-05 12:30:44|43

A1|2021-05-05 13:00:44|55

A1|2021-05-05 13:30:44|60

A1|2021-05-05 14:00:44|64

A1|2021-05-05 14:30:44|66

A1|2021-05-05 15:00:44|65

A1|2021-05-05 15:30:44|71

A1|2021-05-05 16:00:44|76

A1|2021-05-05 16:30:44|82

A1|2021-05-05 17:00:44|87

A1|2021-05-05 17:30:44|93

尝试滞后:

select id, sum(positive), sum(negative)
from (
select
created_at,
id,
value,
if(value >= lag(value) over (order by created_at), 1, 0) as positive,
if(value < lag(value) over (order by created_at), 1, 0) as negative
from `dataset` 
where id LIKE "A1" 
AND value != 0 
AND DATETIME(created_at) BETWEEN PARSE_DATETIME("%Y%m%d:%H:%M:%S", "20210505:09:00:00") AND PARSE_DATETIME("%Y%m%d:%H:%M:%S", "20210505:17:59:59") 
order by created_at desc
)
group by id

您可以使用LAG添加具有来自精确行的值的新列。

使用它可以对当前值为<或>=值。

-- Dummy table
WITH table0 AS (
SELECT 4 AS value, 1 AS createdOn
UNION ALL SELECT 4 AS value, 2 AS createdOn
UNION ALL SELECT 5 AS value, 3 AS createdOn
UNION ALL SELECT 6 AS value, 4 AS createdOn
UNION ALL SELECT 5 AS value, 5 AS createdOn
UNION ALL SELECT 6 AS value, 6 AS createdOn
UNION ALL SELECT 5 AS value, 7 AS createdOn
UNION ALL SELECT 6 AS value, 8 AS createdOn
UNION ALL SELECT 7 AS value, 9 AS createdOn
UNION ALL SELECT 7 AS value, 10 AS createdOn
UNION ALL SELECT 8 AS value, 11 AS createdOn
)
-- SQL Query
SELECT
COUNTIF(value >= prevValue) AS total_increase,
COUNTIF(value < prevValue) AS total_decrease,
FROM (
SELECT
value, LAG(value) OVER (ORDER BY createdOn) AS prevValue
FROM table0
)

最新更新