我目前在BigQuery中有一个表格,其中包含一些异常值,并希望计算该表格的移动中位数。
示例表:
port - qty - datetime
--------------------------------
TCP1 - 13 - 2018/06/11 11:20:23
UDP2 - 15 - 2018/06/11 11:24:24
TCP3 - 12 - 2018/06/11 11:24:27
TCP1 - 2 - 2018/06/12 11:24:26
UDP2 - 15 - 2018/06/12 11:35:32
TCP3 - 200- 2018/06/13 11:45:23
TCP3 - 14 - 2018/06/13 11:54:22
TCP3 - 13 - 2018/06/14 11:55:33
TCP1 - 17 - 2018/06/15 11:43:33
UDP2 - 12 - 2018/06/15 11:55:25
TCP3 - 14 - 2018/06/15 11:26:21
TCP3 - 11 - 2018/06/16 11:55:46
TCP1 - 14 - 2018/06/17 11:34:33
UDP2 - 15 - 2018/06/17 11:43:24
TCP3 - 13 - 2018/06/17 11:47:54
and ...
我希望能够使用bigquery标准SQL在11小时计算出各个端口上的7天移动中位数。 我曾尝试计算移动平均线,但意识到计算受到“异常值”的影响。
我不知道如何编写SQL查询来计算移动中位数。任何帮助将不胜感激。
(这是我可以在以下主题上找到的最接近的线程:BigQuery - Moving median calculation,但我需要bigquery才能从表中获取数量,因为我不知道确切的每一天的数量)
答案 0 :(得分:0)
我认为这已经足够接近您想要的了:
select t.*,
qtys[ordinal(cast(array_length(qtys) / 2 as int64))]
from (select t.*,
array_agg(qty) over (partition by port
order by datetime_diff(datetime, datetime('2000-01-01'), day)
range between 7 preceding and current day
) as qtys
from t
where extract(hour from datetime) = 11
) t;
当结果集中有偶数行时,中位数会有些棘手。这将选择一个任意值。