Ниже приведен пример для BigQuery Standard SQL
#standardSQL
WITH stats AS (
SELECT DATE(PARSE_TIMESTAMP('%Y/%m/%d %T', datetime)) dt,
AVG(qty) - 1.5 * STDDEV(qty) down,
AVG(qty) + 1.5 * STDDEV(qty) up
FROM `project.dataset.table`
GROUP BY dt
)
SELECT port, qty, datetime
FROM `project.dataset.table`
JOIN stats
ON dt = DATE(PARSE_TIMESTAMP('%Y/%m/%d %T', datetime))
WHERE NOT qty BETWEEN down AND up
Вы можете протестировать, поиграть с вышеупомянутыми, используя фиктивные данные из вашего вопроса:
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'TCP1' port, 13 qty, '2018/06/11 11:20:23' datetime UNION ALL
SELECT 'UDP2', 15, '2018/06/11 11:24:24' UNION ALL
SELECT 'TCP3', 14, '2018/06/11 11:24:27' UNION ALL
SELECT 'TCP1', 2 , '2018/06/11 11:24:26' UNION ALL
SELECT 'UDP2', 15, '2018/06/11 11:35:32' UNION ALL
SELECT 'TCP3', 13, '2018/06/11 11:45:23' UNION ALL
SELECT 'TCP3', 14, '2018/06/11 11:54:22' UNION ALL
SELECT 'TCP3', 30, '2018/06/11 11:55:33'
), stats AS (
SELECT DATE(PARSE_TIMESTAMP('%Y/%m/%d %T', datetime)) dt,
AVG(qty) - 1.5 * STDDEV(qty) down,
AVG(qty) + 1.5 * STDDEV(qty) up
FROM `project.dataset.table`
GROUP BY dt
)
SELECT port, qty, datetime
FROM `project.dataset.table`
JOIN stats
ON dt = DATE(PARSE_TIMESTAMP('%Y/%m/%d %T', datetime))
WHERE NOT qty BETWEEN down AND up
с результатом как
Row port qty datetime
1 TCP1 2 2018/06/11 11:24:26
2 TCP3 30 2018/06/11 11:55:33