试试下面,
假设您的表名为 all_time_series,字段为:time_series_name、dt 和 value,并且按照您在问题中描述的逻辑构建
#standardSQL
WITH series AS (
SELECT DISTINCT time_series_name
FROM all_time_series
),
pairs AS (
SELECT
series1.time_series_name AS time_series_1,
series2.time_series_name AS time_series_2,
CONCAT(series1.time_series_name, ' - ', series2.time_series_name) AS pair_name
FROM series AS series1
JOIN series AS series2
ON series1.time_series_name < series2.time_series_name
)
SELECT pair_name, CORR(value1, value2) AS correlation
FROM (
SELECT pair_name, a1.dt AS dt, a1.value AS value1, a2.value AS value2
FROM pairs AS p
JOIN all_time_series AS a1
ON p.time_series_1 = a1.time_series_name
JOIN all_time_series AS a2
ON p.time_series_2 = a2.time_series_name
AND a1.dt = a2.dt
)
GROUP BY pair_name
ORDER BY correlation DESC
LIMIT 20
您可以使用如下的虚拟数据进行测试
#standardSQL
WITH all_time_series AS (
SELECT 'a' AS time_series_name, '2016-01-01' AS dt, 1 AS value UNION ALL
SELECT 'a', '2016-01-02', 2 UNION ALL
SELECT 'a', '2016-01-03', 3 UNION ALL
SELECT 'b', '2016-01-01', 1 UNION ALL
SELECT 'b', '2016-01-02', 2 UNION ALL
SELECT 'b', '2016-01-03', 3 UNION ALL
SELECT 'c', '2016-01-01', 5 UNION ALL
SELECT 'c', '2016-01-02', 6 UNION ALL
SELECT 'c', '2016-01-03', 7 UNION ALL
SELECT 'd', '2016-01-01', 6 UNION ALL
SELECT 'd', '2016-01-02', 2 UNION ALL
SELECT 'd', '2016-01-03', 3
),
series AS (
SELECT DISTINCT time_series_name
FROM all_time_series
),
pairs AS (
SELECT
series1.time_series_name AS time_series_1,
series2.time_series_name AS time_series_2,
CONCAT(series1.time_series_name, ' - ', series2.time_series_name) AS pair_name
FROM series AS series1
JOIN series AS series2
ON series1.time_series_name < series2.time_series_name
)
SELECT pair_name, CORR(value1, value2) AS correlation
FROM (
SELECT pair_name, a1.dt AS dt, a1.value AS value1, a2.value AS value2
FROM pairs AS p
JOIN all_time_series AS a1
ON p.time_series_1 = a1.time_series_name
JOIN all_time_series AS a2
ON p.time_series_2 = a2.time_series_name
AND a1.dt = a2.dt
)
GROUP BY pair_name
ORDER BY correlation DESC
LIMIT 2